LeetCode236:二叉树的最近共同祖先
题目描述
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
输入与输出
例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]
输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
输出: 3
代码及说明
采用递归算法求解
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
//若p或q中任一为正在查询的子树的根节点,则共同祖先就是p或q
if (root == p)
return p;
if (root == q)
return q;
TreeNode left = null,right = null;
//尝试向左子树寻找共同祖先
if (root.left!=null)
left = lowestCommonAncestor(root.left,p,q);
//尝试向右子树寻找共同祖先
if (root.right!=null)
right = lowestCommonAncestor(root.right,p,q);
//题目说明两个节点必存在
//左边查询结果为空,p与q在右侧
if (left==null)
return right;
//右边查询结果为空,p与q在左侧
if (right==null)
return left;
//两侧结果均不为空,则p、q一边一个
if (left!=null&&right!=null)
return root;
return null;
}
}