236. 二叉树的最近公共祖先
1.题目描述及示例
- 题目描述
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。” - 示例
2.题解思路及代码
-
思路
-
代码
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
return postOrder(root,p,q);
}
public TreeNode postOrder(TreeNode root, TreeNode p, TreeNode q)
{
if (root==null)
return null;
if (root==p||root==q)
return root;
TreeNode left=postOrder(root.left,p,q);
TreeNode right=postOrder(root.right,p,q);
if (left!=null&&right!=null)
return root;
else if (left==null&&right==null)
return null;
else if (left==null&&right!=null)
return right;
else
return left;
}
观察后发现,postOrder()代码还能优化,代码如下:
public TreeNode postOrder(TreeNode root, TreeNode p, TreeNode q)
{
if (root==null||root==p||root==q)
return root;
TreeNode left=postOrder(root.left,p,q);
TreeNode right=postOrder(root.right,p,q);
if (left==null&&right==null)
return null;
else if (left==null)
return right;
else if (right==null)
return left;
return root;
}