题目描述
给定二叉搜索树(BST),找到BST中两个给定节点的最低公共祖先(LCA)。
根据Wikipedia对LCA的定义:“在两个节点p和q之间定义的最低公共祖先是T中同时具有p和q作为后代的最低节点(在这里,我们允许一个节点作为其自身的后代)。”
解决
- 迭代实现
由于二叉搜索树是有序的,左子树的所有节点均小于根节点,右子树的所有节点均大于根节点,所以当某个时刻,根节点的值大于p而小于q,说明此时的根节点即为最近公共祖先。
代码:
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
while(root != null){
if(root.val > p.val && root.val > q.val){
//都比根节点值小,去根节点的左子树继续找
root = root.left;
}else if(root.val < p.val && root.val < q.val){
//都比根节点值大,去根节点的右子树继续找
root = root.right;
}else {
//根节点的值大于p而小于q,说明此时的根节点即为最近公共祖先。
return root;
}
}
return null;
}
- 递归实现
原理和1一样
代码:
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
TreeNode left = null;
TreeNode right = null;
if(p.val < root.val && q.val < root.val){
left = lowestCommonAncestor(root.left, p, q);
}else if(p.val > root.val && q.val > root.val){
right = lowestCommonAncestor(root.right, p, q);
}else {
return root;
}
if(left == null){
return right;
}else if(right == null){
return left;
}
return root;
}