题目:leetcode235. 二叉搜索树的最近公共祖先
描述:
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5]
思路:
首先这棵树是二叉搜索树,也就意味着这是一颗有序数,中序遍历有序。因为中序遍历有序,也就是左节点<根节点<右节点,所以两个结点的最近公共祖先结点一定是大于左节点,小于右节点。我们只需要从上到下找到第一个位于p和q之间的结点就可以了。
下面是递归法和迭代法解决。
代码
递归法
public class Solution{
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if(root.val>p.val && root.val>q.val)
return lowestCommonAncestor(root.left,p,q);
if(root.val<p.val && root.val<q.val)
return lowestCommonAncestor(root.right,p,q);
return root;
}
}
迭代法
public class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
while(true)
{
if(root.val>p.val && root.val>q.val)
root=root.left;
else if(root.val<p.val && root.val<q.val)
root=root.right;
else
break;
}
return root;
}
}
```