Day17 | 700二叉搜索树中的搜索&98验证二叉搜索树&530二叉搜索树的最小绝对差&501二叉搜索树中的众数

61 阅读2分钟

二叉搜索树中的搜索 LeetCode 700

题目链接:[LeetCode 700 - 简单]

思路

二叉搜索树是一个有序树:

  • 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
  • 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
  • 它的左、右子树也分别为二叉搜索树

本题终止条件: if(root.val == val){ return root; } 递归逻辑: if(root.val > val){ return searchBST(root.left,val); }else if(root.val < val){ return searchBST(root.right,val); }

递归:

class Solution {
    public TreeNode searchBST(TreeNode root, int val) {
        if(root==null)return null;
        if(root.val == val){
            return root;
        }else if(root.val > val){
            return searchBST(root.left,val);
        }else if(root.val < val){
            return searchBST(root.right,val);
        }
        return null;
    }
}

验证二叉搜索树 LeetCode 98

题目链接:[LeetCode 98 - 简单]

思路

同样也是搜索二叉树 但是该题特别需要注意的是:必须采用中序遍历的方式 -> 采用中序遍历可以满足遍历的所有节点上的val从小到大排列。

本题终止条件: if(root == null) return true; if(!left) return false; if(root.val <= prev) return false; 递归逻辑: 中序遍历:左中右

递归:

class Solution {
    private long prev = Long.MIN_VALUE;
    public boolean isValidBST(TreeNode root) {
        if(root == null) return true;
        boolean left = isValidBST(root.left);
        if(!left) return false;
        if(root.val <= prev) return false;
        prev = root.val;
        return isValidBST(root.right);
    }
}

二叉搜索树的最小绝对差 LeetCode 530

题目链接:[LeetCode 530 - 简单]

思路

二叉搜索树的最小绝对差 -> 首先最对差一定大于0 因为二叉搜索树中序遍历的情况下,就是一个单调递增的数组

本题终止条件:没有明确终止条件 递归逻辑:中序遍历

递归:

class Solution {
    private int prev = Integer.MIN_VALUE;
    private int result = Integer.MAX_VALUE;
    public int getMinimumDifference(TreeNode root) {
        if(root==null)return result;
        int left = getMinimumDifference(root.left);
        if(root.val - prev >0)
            result = Math.min(result,root.val - prev);
        prev = root.val;
        int right = getMinimumDifference(root.right);
        return result;
    }
}

二叉搜索树中的众数 LeetCode 501

题目链接:[LeetCode 501 - 简单]

思路

暴力解法和不使用额外空间的两种做法。 本题终止条件:没有具体的终止条件 递归逻辑:采用中序遍历

递归:

class Solution {
    ArrayList<Integer> resList = new ArrayList<>();
    int count;
    int maxCount;
    TreeNode pre;
    public int[] findMode(TreeNode root) {
        count = 0;
        maxCount = 0;
        pre = null;
        findMode1(root);
        int[] res = new int[resList.size()];
        for(int i=0;i<resList.size();i++){
            res[i]=resList.get(i);
        }
        return res;
    }
    private void findMode1(TreeNode root){
        if(root==null)return;

        findMode1(root.left);
        int rootValue = root.val;
        if(pre == null || rootValue!=pre.val){
            count = 1;
        }else{
            count++;
        }

        if(count > maxCount){
            resList.clear();
            resList.add(rootValue);
            maxCount = count;
        }else if(count == maxCount){
            resList.add(rootValue);
        }
        pre = root;

        findMode1(root.right);
    }
}