题解 | #在二叉树中找到两个节点的最近公共祖先#
在二叉树中找到两个节点的最近公共祖先
http://www.nowcoder.com/practice/e0cc33a83afe4530bcec46eba3325116
最直观的解法
要求最近的祖先,首先定义一个求val在root节点左子树或右子树的函数。对于val1,val2
-
若一个在左子树,一个在右子树,显然root即为最近祖先
-
若val1,val2中有一个在root上,即root.val=val1 or val2.显然root为最近祖先
-
最坏的情况,val1,val2在同一棵子树上,我们则将root设置为root.left或root.right,进行循环判断
public int lowestCommonAncestor (TreeNode root, int o1, int o2) {
// write code here
while(root!=null)
{
int l = iswhere(root,o1);
int r = iswhere(root,o2);
//在同一子树上或一个即为root
if(l!=r||l==0||r==0) return root.val;
//都在左子树,继续找
else if(l<0) root =root.left;
//都在右子树,继续找
else root =root.right;
}
//永远不会返回99,为了防止报错
return 99;
}
public int iswhere(TreeNode root,int val)
{
//求val在root的左子树或右子树
//-1:左子树 1:右子树
//0:val在根节点root.val上 -2:不在这棵树上
if(root == null) return -2;
if(root.val == val) return 0;
if(iswhere(root.left,val)==-2)
{
if(iswhere(root.right,val)==-2)
return -2;
else return 1;
}
else return -1;
}
}