二叉搜索树

530. 二叉搜索树的最小绝对差(783题一样)
给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 。
差值是一个正数,其数值等于两值之差的绝对值。

示例 1:
二叉搜索树_第1张图片

输入:root = [4,2,6,1,3]
输出:1

示例 2:
二叉搜索树_第2张图片

输入:root = [1,0,48,null,null,12,49]
输出:1
解析过程:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
   
    List<Integer> list=new ArrayList<>();
    public int getMinimumDifference(TreeNode root) {
   
        //先中序遍历,然后求差
        if(root == null){
   
            return 0;
        }
        InOrder(root);
        int value=Integer.MAX_VALUE;
        for(int i=1;i<list.size();i++){
   
            value=Math.min(value,list.get(i)-list.get(i-1));
        }
        return value;
    }
    
    public void InOrder(TreeNode root){
   
        if(root == null){
   
            return;
        }
        InOrder(root.left);
        list.add(root.val);
        InOrder(root.right);
    }
}

结果:
执行用时:1 ms, 在所有 Java 提交中击败了46.33%的用户
内存消耗:38.9 MB, 在所有 Java 提交中击败了14.61%的用户
通过测试用例:188 / 188

700. 二叉搜索树中的搜索
给定二叉搜索树(BST)的根节点和一个值。 你需要在BST中找到节点值等于给定值的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 NULL。
例如,
给定二叉搜索树:

    4
   / \
  2   7
 / \
1   3

和值: 2
你应该返回如下子树:

  2     
 / \   
1   3

在上述示例中,如果要找的值是 5,但因为没有节点值为 5,我们应该返回 NULL。
解析过程:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
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 {
   
            return searchBST(root.right,val);
        }
        
    }
}

结果:
执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户
内存消耗:38.9 MB, 在所有 Java 提交中击败了95.56%的用户
通过测试用例:36 / 36

701. 二叉搜索树中的插入操作
给定二叉搜索树(BST)的根节点和要插入树中的值,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 ,新值和原始二叉搜索树中的任意节点值都不同。
注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。 你可以返回 任意有效的结果 。
示例 1:
二叉搜索树_第3张图片

输入:root = [4,2,7,1,3], val = 5
输出:[4,2,7,1,3,5]

示例 2:
输入:root = [40,20,60,10,30,50,70], val = 25
输出:[40,20,60,10,30,50,70,null,null,25]
示例 3:
输入:root = [4,2,7,1,3,null,null,null,null,null,null], val = 5
输出:[4,2,7,1,3,5]
解析过程:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
   
    public TreeNode insertIntoBST(TreeNode root, int val) {
   
        //可以先通过二分查找的方式找到需要插入的位置
        if(root == null){
   
            return new TreeNode(val);
        }
        TreeNode node=root;
        while(node != null){
   
            //如果节点值小于新值,在右子树上查找
            if(node.val < val){
   
                if(node.right == null){
   
                    node.right= new TreeNode(val);
                    break;
                }else{
   
                    node = node.right;
                }
            }else {
   
                if(node.left == null){
   
                    node.left=new TreeNode(val);
                    break;
                }else {
   
                    node=node.left;
                }
            }
           
        }
                
        return root;
    }
}

结果:
执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户
内存消耗:39 MB,在所有 Java 提交中击败了65.23%的用户
通过测试用例:35 / 35

98. 验证二叉搜索树
(与面试题04.05.合法二叉树一样)
给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。
有效 二叉搜索树定义如下:
节点的左子树只包含 小于 当前节点的数。
节点的右子树只包含 大于 当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。

示例 1:
二叉搜索树_第4张图片

输入:root = [2,1,3]
输出:true
示例 2:
二叉搜索树_第5张图片
输入:root = [5,1,4,null,null,3,6]
输出:false
解释:根节点的值是 5 ,但是右子节点的值是 4 。
解析过程:
方法一:
递归

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
   
    public boolean isValidBST(TreeNode root) {
   
        //时间复杂度和空间复杂度都为O(n)
        return isValidT(root,Long.MIN_VALUE,Long.MAX_VALUE);
    }
    public boolean isValidT(TreeNode root,long low,long high){
   
        //递归DFS
        //左子树的节点需要保证小于根节点,右子树的节点需要保证大于根节点
        if(root == null){
   
            return true;
        }
        //采用上界和下界到的思想
        if(root.val<=low ||root.val>=high){
   
            return false;
        }
        return isValidT(root.left,low,root.val) &

你可能感兴趣的:(LeetCode,leetcode,算法,职场和发展)