寻找二叉树中两个节点的最近父节点。
可以利用二叉树的特性,即左子树节点都小于root,右子树节点都大于root....我们只需要从上到下移动root的位置与p和q两个节点比较大小关系即可。当找到第一个root使得root的值介于p和q之间,那么p,q节点定分布于root两侧,则当前的root必定是p和q的最近公共父节点。否则,p和q定居于root的同一侧,比较其与root的大小关系可以得到是左子树还是右子树,移动root即可。注:当root移动至null时代表不存在公共父节点,返回null。
总体的代价为O(logn)的
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if(root==null||p==null||q==null)
{
return null;
}
if(p.val == q.val)
{
return p;
}
TreeNode temp = root;
while((p.val-temp.val)*(q.val-temp.val)>0)
{
if(p.val>temp.val)
{
temp = temp.right;
}
else
{
temp = temp.left;
}
if(temp == null)
{
return null;
}
}
return temp;
}
}