Day4 二叉搜索树相关

700. BST的搜索

class Solution { 
    // 递归
    public TreeNode searchBST(TreeNode root, int val) {
        if (root == null) return root;
        if (val > root.val) return searchBST(root.right,val);
        if (val < root.val) return searchBST(root.left,val);
        // 递归结束的条件是 val == root.val,此时return root
        return root;
    }
}

class Solution {
    // 迭代,利用二叉搜索树特点,不需要栈
    public TreeNode searchBST(TreeNode root, int val) {
        while (root != null)
            if (val < root.val) root = root.left;
            else if (val > root.val) root = root.right;
            else return root;
        return null;
    }
}

98.验证二叉搜索树

递归法:中序遍历,验证遍历的节点值是否为升序

class Solution {
    public boolean isValidBST(TreeNode root) {
        Deque<TreeNode> stack = new LinkedList<TreeNode>();
        double inorder = -Double.MAX_VALUE;
        if (root == null) return true;
        while( !stack.isEmpty()|| root != null){

            while( root != null){
                stack.push(root);
                root = root.left;
            }

            root = stack.pop();
            if (root.val <= inorder){
                return false;
            }
            inorder = root.val;
            root = root.right;
        }
        return true;
    }
}

235. 二叉搜索树的最近公共祖先: 力扣

二叉搜索树是有序的,节点cur左侧node比cur小,右侧node比cur大。分析可得:从上到下第一次遇到的数值在[p, q]区间中的节点cur就是 p和q的最近公共祖先。所以,只需根据cur的大小判断往哪支走,遇到的第一个落在区间里的就返回。

public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
    if (root.val > p.val && root.val > q.val) return lowestCommonAncestor(root.left, p, q);
    if (root.val < p.val && root.val < q.val) return lowestCommonAncestor(root.right, p,q);
    return root;
}

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

因为BST是有序的,最小绝对差肯定出在中序遍历中相邻两个节点。用pre指针来记录上一个遍历的节点。

if (pre!=null){
    result = Math.min(result,root.val-pre.val);
}
pre = root;

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

  • 第五种情况:左右孩子节点都不为空,则将删除节点的左子树头结点(左孩子)放到删除节点的右子树的最左面节点的左孩子上,返回删除节点右孩子为新的根节点。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值