二叉搜索树

700.二叉搜索树中的搜索

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

例如,

700.二叉搜索树中的搜索

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

 

 public TreeNode searchBST(TreeNode root, int val) {
        return search(root,val);

    }
    private TreeNode search(TreeNode root,int val){
        if(root==null){
            return null;
        }
 
        if(val>root.val){
           return search(root.right,val);
        }
        if(val<root.val){
            return search(root.left,val);
        }
        return root;
    }

 

98. 验证二叉搜索树

给定一个二叉树,判断其是否是一个有效的二叉搜索树。

假设一个二叉搜索树具有如下特征:

  • 节点的左子树只包含小于当前节点的数。
  • 节点的右子树只包含大于当前节点的数。
  • 所有左子树和右子树自身必须也是二叉搜索树。

98.验证二叉搜索树

 

 public boolean isValidBST(TreeNode root) {
      return process(root).isBST;
    }

    // max ,min left.isbst right.isbst left.max<root.val right.min>root.val
    private Info process(TreeNode root){
        if(root ==null){
            return null;// 注意这里,设为空就好,因为最大值和最小值不好设置,会超限的情况,不好控制,后面用时判空就好
        }
   
        Info left=process(root.left);
        Info right=process(root.right);
        int min=root.val;
        int max=root.val;
        
        if(left!=null){
            min=Math.min(left.min,min);
            max=Math.max(left.max,max);
        }
        if(right!=null){
            min=Math.min(right.min,min);
            max=Math.max(right.max,max);
        }
        boolean isBST=false;
        boolean leftFlag=left==null?true:left.isBST && left.max<root.val;
        boolean rightFlag=right==null?true:right.isBST && right.min>root.val;
        if(leftFlag && rightFlag){
            isBST=true;
        }
        return new Info(max,min,isBST);
    }

    public class Info{
        int max;
        int min;
        boolean isBST;
        public Info(int max,int min,boolean isBST){
            this.max=max;
            this.min=min;
            this.isBST=isBST;
        }
    }

  

 

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

给你一棵所有节点为非负值的二叉搜索树,请你计算树中任意两节点的差的绝对值的最小值。

示例:

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

提示:树中至少有 2 个节点。

思路

题目中要求在二叉搜索树上任意两节点的差的绝对值的最小值。

注意是二叉搜索树,二叉搜索树可是有序的。

遇到在二叉搜索树上求什么最值啊,差值之类的,就把它想成在一个有序数组上求最值,求差值,这样就简单多了。

递归

那么二叉搜索树采用中序遍历,其实就是一个有序数组。

在一个有序数组上求两个数最小差值。

最直观的想法,就是把二叉搜索树转换成有序数组,然后遍历一遍数组,就统计出来最小差值了

 

 遇到在二叉搜索树上求什么最值,求差值之类的,都要思考一下二叉搜索树可是有序的,要利用好这一特点。

class Solution {
    int minDiff=Integer.MAX_VALUE;
    TreeNode pre=null;
   
    public int getMinimumDifference(TreeNode root) {
         getMinDiff(root);
         return minDiff;
    }

    private void getMinDiff(TreeNode root){
        if(root==null){
            return;
        }
        getMinDiff(root.left);
        if(pre!=null){
            minDiff=Math.min(minDiff,Math.abs(pre.val-root.val));
        }

        pre=root;
        getMinDiff(root.right);
    
    }
}

  

 

701. 二叉搜索树中的插入操作

给定二叉搜索树(BST)的根节点和要插入树中的值,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 ,新值和原始二叉搜索树中的任意节点值都不同。

注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。 你可以返回 任意有效的结果 。

 

示例 1:

 

 

 

public TreeNode insertIntoBST(TreeNode root, int val) {
        return insert(root,val);
    }

    public TreeNode insert(TreeNode root,int val){
        if(root==null){
            return new TreeNode(val);
        }
        TreeNode cur=root;
        TreeNode pre=null;
        while(cur!=null){
             pre=cur;
            if(val>cur.val){
                cur=cur.right;
            }else {
                cur=cur.left;
            }
        }

        if(val>pre.val){
            pre.right=new TreeNode(val);
        }else{
            pre.left=new TreeNode(val);
        }
        return root;
    }

 

450. 删除二叉搜索树中的节点

给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。

一般来说,删除节点可分为两个步骤:

首先找到需要删除的节点;
如果找到了,删除它。
说明: 要求算法时间复杂度为 O(h),h 为树的高度。

示例:

root = [5,3,6,2,4,null,7]
key = 3

5
/ \
3 6
/ \ \
2 4 7

 public TreeNode deleteNode(TreeNode root, int key) {
        return delete(root,key);
    }

    private TreeNode delete(TreeNode root,int key){
        if(root==null){
            return root;
        }
        TreeNode cur=root;
        if(key>cur.val){
            cur.right=delete(cur.right,key);//理解一下这里
        }else if(key<cur.val){
            cur.left=delete(cur.left,key);
        }else{
            if(cur.left==null && cur.right==null){
                cur=null;
            }else if(cur.left==null && cur.right!=null){
                cur=cur.right;
            }else if(cur.right==null && cur.left!=null){
                cur=cur.left;
            }else{
                TreeNode des=cur.right;
                TreeNode pre=null;
                while(des.left!=null){
                    pre=des;
                    des=des.left;
                }
                if(pre!=null){
                    pre.left=des.right;
                    des.right=cur.right;
                }
                des.left=cur.left;
                cur=des;
                
            }
        }
        return cur;
    }

  

108. 将有序数组转换为二叉搜索树

给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。

高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。

 

示例 1:

输入:nums = [-10,-3,0,5,9]
输出:[0,-3,9,-10,null,5]
解释:[0,-10,5,null,-3,null,9] 也将被视为正确答案:

public TreeNode sortedArrayToBST(int[] nums) {
        if(nums==null || nums.length==0){
            return null;
        }
        return sortTree(nums,0,nums.length-1);
    }

    private TreeNode sortTree(int[] nums,int L,int R){
        if(L>R){
            return null;
        }
        int M=L+((R-L)>>1);
        TreeNode root=new TreeNode(nums[M]);
        root.left=sortTree(nums,L,M-1);
        root.right=sortTree(nums,M+1,R);
        return root;
    }

  

 

posted @ 2021-10-09 22:05  sherry001  阅读(45)  评论(0编辑  收藏  举报