[leetCode]剑指 Offer 68 - I. 二叉搜索树的最近公共祖先
思路
从根节点开始遍历:
- 如果当前节点大于p,q 那么p,q的最近公共节点在当前节点的左子树
- 如果当前节点小于p,q 那么p,q的最近公共节点在当前节点的右子树
- 如果当前节点的值不满足上述两条要求,那么说明当前节点就是「分岔点」。此时,pp 和 qq 要么在当前节点的不同的子树中,要么其中一个就是当前节点。
递归
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;
}
}
循环
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
TreeNode ancestor = root;
while (true) {
if (ancestor.val > p.val && ancestor.val > q.val)
ancestor = ancestor.left;
else if (ancestor.val < p.val && ancestor.val < q.val)
ancestor = ancestor.right;
else
break;
}
return ancestor;
}
}
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步