Lowest Common Ancestor of a Binary Tree
给定一棵二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义: “对于有根树T的两个结点u、v,最近公共祖先表示一个结点x,满足x是u、v的祖先且x的深度尽可能大。”(一个节点也可以是它自己的祖先)
例如,给定如下二叉搜索树: root = [3,5,1,6,2,0,8,null,null,7,4]
_______3______
/ \
___5__ ___1__
/ \ / \
6 2 0 8
/ \
7 4
示例 1:
输入: root, p = 5, q = 1
输出: 3
解释: 节点 5 和节点 1 的最近公共祖先是节点 3。
示例 2:
输入: root, p = 5, q = 4
输出: 5
解释: 节点 5 和节点 4 的最近公共祖先是节点 5。因为根据定义最近公共祖先节点可以为指定节点自身。
分析
这道题分析一下,判断公共祖先的情况:
- 如果其中一个节点和根节点相同,那么显然,根节点就是最低公共祖先,如果都不和根节点相同,则需要进行递归左右子树,递归思路如下:
- 如果二者分别出现在根节点的左右子树(一左一右),那么显然根节点就是最低公共祖先
- 如果两节点都在根节点的左子树,说明最低公共祖先出现在左子树
- 如果两节点都在根节点的右子树,说明最低公共祖先出现在右子树
代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if(root==null||p ==null||q == null){
return null;
}
if(p==root||q==root){
return root;
}
TreeNode left_ancestor = lowestCommonAncestor(root.left,p,q);//判断是否p,q属于左子树
TreeNode right_ancestor = lowestCommonAncestor(root.right,p,q);//判断是否p,q属于右子树
//左子树右子树一边一个
if(left_ancestor!=null && right_ancestor!=null){
return root;
}
//全在右子树
if(left_ancestor ==null){
return right_ancestor;
}else {
//全在左子树
return left_ancestor;
}
}
}