剑指offer之二叉搜索树的最近公共祖先

67 阅读1分钟

原题链接点这里

解题思路

对于每一个节点,p,q有三种情况

  • p,q都在该节点的右子树上
  • p,q都在该节点的左子树上
  • p,q分别位于该节点的左右子树(这种情况,该节点就是p,q的最近公共节点

本题利用了二叉搜索树(排序树)的特性,根据val值判断了属于上述那种情况
  • root.val<p.val&&root.val<q.val(p,q都在右子树)
  • root.val>p.val&&root.val>q.val(p,q都在左子树)

迭代法

var lowestCommonAncestor = function(root, p, q) {
while(root){
if(root.val<p.val&&root.val<q.val){
root=root.right
}
else if(root.val>p.val&&root.val>q.val){
roor=root.left
}
else{
return root
}
}

递归法

var lowestCommonAncestor = function(root, p, q) {
if(root.val<p.val&&root.val<q.val){
return lowestCommonAncestor(root.right,p,q)
}
else if(root.val>p.val&&root.val>q.val){
return lowestCommonAncestor(root.left,p,q)
}
else{
return root
}
}