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一开始的确没想到这么做

  • 不错的题目

https://leetcode.com/problems/largest-bst-subtree/discuss/78891/Share-my-O(n)-Java-code-with-brief-explanation-and-comments

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?