二叉搜索树(BST)的相关问题

前言:在二叉搜索树中,对于每个结点,它的所有左子树结点的元素小于当前节点数据,所有右子树结点大于当前结点。
二叉搜索树的三种常见操作:查找、删除、插入。

查找

在查找操作中,就可以看到二叉搜索树的优势,它的时间复杂度为O(lg n).

//查找
 public TreeNode find(TreeNode root,int data){
     if(root == null)  return null;
     if(root.val>data) return find(root.left,data);
     if(root.val<data) return find(root.right,data);
     return root;        
 }
//查找最小值
 public TreeNode findMin(TreeNode root){
     if(root == null)  return null;
     if(root.left==null) return root;
     return findMax(root.left);        
 }   
//查找最大值
public TreeNode findMax(TreeNode root) {

    if(root==null) return null;
    if(root.right==null)  return root;    
    return findMax(root.right);            
}

插入:

思路:首先找到要插入数据的位置,与查找类似。当找到这个位置后,如果数据已经存在,则直接返回即可,否则,将数据插入到走过的最后一个位置上。


 public TreeNode insert(TreeNode root,int data){
     if(root == null) {
        root  = new TreeMode(data);
        root.left = null;
        root.right = null;
    } 

     if(root.val>data) root.left = insert(root.left,data);
     if(root.val<data) root.right = insert(root.right,data);

     return root;        
 }

删除: leetcode第450题 Delete Node in a BST

思路:首先找到这个结点,然后删除这个结点即可。删除的过程中听注意:如果该节点的为叶子结点,直接删除结点;如果只有一个孩子结点,就用这个结点替代即可;如果该节点有两个结点,可以有两种做法:1,用左子树中最大的结点替换该节点,并在左子树中删除该最大节点。2、用右子树中最小的结点替换该节点,并在右子树中删除该最小节点。

java代码实现

class Solution {
    //考虑四种情况
    public TreeNode deleteNode(TreeNode root, int key) {
        if(root ==null) return null;

        if(root.val>key){
            root.left = deleteNode(root.left, key);
        }else if(root.val<key){
            root.right = deleteNode(root.right,key);
        }else{
            if(root.left!=null&&root.right!=null){
               TreeNode t = findMax(root.left);
               root.val = t.val;
               root.left = deleteNode(root.left,t.val);

            }else{               
                if(root.left==null)
                    root = root.right;
                else
                    root = root.left;
            } 

        }

        return   root;  

    }

    public TreeNode findMax(TreeNode root) {

        if(root==null) return null;
        if(root.right==null)  return root;

        return findMax(root.right);            
    }

}

判断:leetcode第98题 Validate Binary Search Tree

思路:只要保证当前节点的左子树中的最大值小于当前节点,右子树中的最小值大于当前节点的值。遍历整个树中的结点即可。这里我们会犯得的一个错误是,仅判断当前结点的左孩子结点小于当前结点,右孩子结点大于当前结点是不够的。原因就在于左子树中可能存在比当前结点大的值。右子树存在比当前结点小的值。

JAVA代码实现

class Solution {
    public boolean isValidBST(TreeNode root) {
        if(root ==null) return true;

        if(root.left!=null&&findMax(root.left).val >=root.val) return false;

        if(root.right!=null&&findMin(root.right).val<=root.val) return false;

        return isValidBST(root.left)&&isValidBST(root.right);
    }

    public TreeNode findMax(TreeNode root){
        if(root == null)  return null; 
        if(root.right==null) return root;
        return findMax(root.right);        
    }

    public TreeNode findMin(TreeNode root){
        if(root == null)  return null;
        if(root.left==null) return root;
        return findMax(root.left);        
    }    
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值