【LeetCode刷题笔记】(十)树(2)二叉搜索树

115 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第32天,点击查看活动详情 这也是第43篇文章

前言

在二叉树中,二叉搜索树(BST)是一个很特殊的存在,很多题目也围绕它展开。那么它有什么神奇之处呢?答案就在它的结点元素相对大小。

对于BST中的某个子树而言,左子节点的值<根节点的值<右子节点的值。

可以利用这个性质解决很多问题。

比如下面这一题。

二叉搜索树的最近公共祖先

题目

给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

说明:

  • 所有节点的值都是唯一的。
  • p、q 为不同节点且均存在于给定的二叉搜索树中。

思路

这题可以利用结点元素相对大小的关系,结合递归来做。

代码实现

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

二叉搜索树中的中序后继

题目

给定一棵二叉搜索树和其中的一个节点 p ,找到该节点在树中的中序后继。如果节点没有中序后继,请返回 null 。

节点 p 的后继是值比 p.val 大的节点中键值最小的节点,即按中序遍历的顺序节点 p 的下一个节点。

思路

利用结点元素相对大小的关系,通过遍历原树结点,构造新树。

代码实现

class Solution {
    public TreeNode inorderSuccessor(TreeNode root, TreeNode p) {
        TreeNode res=null;
        if(p.right!=null){
            res=p.right;
            while(res.left!=null){
                res=res.left;
            }
            return res;
        }
        TreeNode node=root;
        while(node!=null){
            if(p.val<node.val){
                res=node;
                node=node.left;
            }
            else node=node.right;
        }
        return res;
    }
}