题目: 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
名词解释:
最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。
示例:
思路—递归:
根据题意可以得知,要求从根节点为root的树返回p、q的最近公共祖先,使用递归方法,如果p、q均小于root,则应该由root的左子树返回p、q的最近公共祖先;如果p、q均大于root,则应该从root的右子树返回p、q的最近公共祖先。
Code-递归
class Solution {
public TreeNode lowestCommonAncetor(TreeNode root, TreeNode p, TreeNode q) {
if (p.val < root.val && q.val < root.val) {
return lowestCommonAncestor(root.left, p, q);
}
if (p.val > root.val && q.val > root.val) {
return lowestCommonAncestor(root.right, p, q);
}
return root;
}
}
思路–迭代:
从根结点开始往下找,如果p、q均小于root,则从root的左子树中寻找,如果p、q均大于root,则从root的右子树中寻找;其余情况包括若p、q一个比root大,一个比root小,或者是p、q中有一个就是root,以上就意味着当前root就是p、q的最近公共祖先。
Code–迭代
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
while (root != null) {
if (p.val < root.val && q.val < root.val) {
return lowestCommonAncestor(root.left, p, q);
}
if (p.val > root.val && q.val > root.val) {
return lowestCommonAncestor(root.right, p, q);
}
return root;
}
return null;
}
}
PS:
以上递归和迭代其时间复杂度均为O(N),因为在最坏的情况下其要访问树的所有结点。
空间复杂度:
(1)递归算法的空间复杂度为O(N),所需开辟的额外空间主要是递归栈产生的,故同BST的树高成正比。
(2)迭代算法的空间复杂度为O(1),指在一次计算后就可找到目标。