二叉搜索树的最近公共祖先(235)

题目: 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。

名词解释:
最近公共祖先的定义为:“对于有根树 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),指在一次计算后就可找到目标。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值