本文正在参与掘金团队号上线活动,点击 查看大厂春招职位
一、题目描述:
这个题目说的是,给你一棵二叉搜索树以及树中两个节点,你要找到这两个节点的最近公共祖先,然后将它返回。注意,树上所有的节点值都不相同。
比如说,给你的二叉搜索树为:
4
/ \
2 5
/ \ \
1 3 6
节点 1 和 3 的最近公共祖先是节点 2;
节点 3 和 6 的最近公共祖先是节点 4;
节点 4 和 6 的最近公共祖先也是节点 4。
二、思路分析:
目标:找到目标节点。
因为搜索树有规则,所以相对比较好找。
思路步骤:
- 目标值均大于 或 小于根节点,继续迭代下去
- 目标值不均大于或小于根节点,则返回根节点
方法:
- 递归方法
- 迭代方法
三、AC 代码:
public class LeetCode_105 {
// 方法一:递归方法
// Time: O(h), Space: O(h), Faster: 100%
public TreeNode lcaRecursive(TreeNode root, TreeNode p, TreeNode q) {
if (p.val < root.val && q.val < root.val)
return lcaRecursive(root.left, p, q);
else if (p.val > root.val && q.val > root.val)
return lcaRecursive(root.right, p, q);
else return root;
}
// 方法二:迭代方法
// Time: O(h), Space: O(1), Faster: 12.12%
public TreeNode lcaIterative(TreeNode root, TreeNode p, TreeNode q) {
while (root != null) {
if (p.val < root.val && q.val < root.val) root = root.left;
else if (p.val > root.val && q.val > root.val) root = root.right;
else return root;
}
return null;
}
}
四、总结:
充分掌握树的性质。