BST
validate BST
inorder successor of BST
BST Iterator
closest value of BST I II(难题)
Unqiue BST I II 充分利用BST的性质!!
Largest BST subtree
Delete Node in BST
Convert BST to Greater Tree (好题)
Recover BST
这题有个技巧,要设两个全局变量
boolean firstNode = true;
int prev = Integer.MIN_VALUE;
然后就是关键一步
if(!firstNode && prev >= root.val) return false;
public class Solution {
private boolean firstNode = true;
private int prev = Integer.MIN_VALUE;
public boolean isValidBST(TreeNode root) {
//inorder traversal incremental
if(root == null) return true;
if(!isValidBST(root.left)) return false;
if(!firstNode && prev >= root.val) return false;
firstNode = false;
prev = root.val;
if(!isValidBST(root.right)) return false;
return true;
}
}还有一种不用设全局变量的做法, recursion
建立private boolean isBST(TreeNode root, Integer min, Integer max)
并且初始化isBST(root, null,null)
这个用的是Divide & Conquer的思路,更简单
这题首先想到一个naive的解法,就是首先判断p有没有right child
如果有的话,直接找p.right里的leftmost child
如果没有的话,就需要从root遍历寻找到p,同时需要用一个succ纪录目前遍历过的比它大的最小的数,也就是successor
只有当p.val < root.val的时候才更新succ = root;
写出来的代码虽然不算慢,但是好长好丑,只打败21%
后来想想,发现可以直接遍历查找这棵树的同时判断root.val和p.val,来确定朝left走还是right
代码简洁,实际面试过程中不太好想
所有关于tree的题目都要想着用iterative 和recursive来解决

这题inOrderSuccesscor(TreeNode root, TreeNode p)返回的是在root这棵BST里面的P的successor
下面关键就是判断root.val和p.val和p.val和p.val的关系
p.val >= root.val的意义在于,我们可以确定p的successor肯定不可能是root,而且只可能在root.right这棵子树里,所以把这个任务交给root.right去处理。
只有在p.val < root.val的时候,root才有可能是p的successor,注意是有可能!
那什么时候root是p的sucessor呢?那就是当root.left里找不到p的successor的时候,也就是inOrderSuccessor(root.left, p) == null的时候,具体意义就是root.left子树里没有node的值> p.val。
当然如果inOrderSuccessor(root.left, p )返回不为空,也就意味着在root.left里找到了p的successor, 所以直接返回这个值
搞清楚p = 9和p = 11的例子
BST Iterator
inorder traversal
先找到left most child,也就是最小的点node,这个过程中的node都放进stack
然后cur指向node.right
找到离target最近的一个node.val
假设root.val < target,就判断右子树的closestValue b和root.val哪个更接近
如果root.val > target,就判断左子树的closestValue b 和root.val哪个更接近
找到离target最近的K个node.val
自己推了一遍,思路是有的
最后公式的总结还需熟练
Unique BST II
这题不难想到
public List<TreeNode> genTree(int beign, int end)但是遍历leftSubTree和rightSubTree一开始的确没想到这么做
不错的题目
Convert BST to greater Tree
greater tree的性质就是inorder 之后是一个descending order
do ad reverse inOrder traversal and add rightSum to the root.val
brute force的方法就是inorder traversal, 然后找到两个node, 可以存成global variable
trick在于当我们发现prev.val >= root.val时候如何判断哪个是需要swap的node
这里可以首先check firstNode == null, 如果不空则说明当前root是secondNode
follow up可以是要求iterative实现inorder
难点在于要求in place, 那就只能上morris traversal了
Last updated
Was this helpful?