题目
Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in the BST.
思路
题目要求一个二叉排序树的两个节点的公共父节点,说通俗点,其实就是这两个节点所在的分支是从哪里开始分叉的。求出这个分叉点。
对于二叉排序树,它的一个特点就是:一个节点的左子树节点都小于该节点,而一个节点的右子数的各节点都大于该节点。
因此,我们可以通过寻找这两个节点的中间节点来寻找公共父节点。
再衍生分析一下,如果某个节点同时大于所给节点,说明,所求节点一定在当前节点的左子树上;同理,如果当前节点同时小于所给的两个节点,则所求节点一定在该节点的右子树上。
需要注意的是:在求的过程中,还需要考虑如果所求节点是两个节点中的一个的情况。还有在求出当前节点时,别忘了验证一下,该节点为根的树上有没有这两个所给节点(因为有可能所给节点不在树上)。
代码
public boolean exist(TreeNode root, TreeNode pNode){
while(root!=null){
if(pNode.val==root.val)
return true;
else{
if(pNode.val>root.val)
root = root.right;
else {
root = root.left;
}
}
}
return false;
}
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
TreeNode currentNode = root;
if(root==null)
return null;
while(currentNode!=p && currentNode!=q){
if(p.val<currentNode.val && q.val<currentNode.val){
currentNode = currentNode.left;
} else if(p.val>currentNode.val && q.val>currentNode.val){
currentNode = currentNode.right;
} else{
if(exist(currentNode, p) && exist(currentNode, q))
return currentNode;
else {
return null;
}
}
}
if(exist(currentNode, p) && exist(currentNode, q))
return currentNode;
return null;
}