开启掘金成长之旅!这是我参与「掘金日新计划 · 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;
}
}