BST 的最低共同祖先
“BST 最低共同祖先”问题的详细指南和 Python 实现。
1. 学习
“BST 的最低共同祖先”问题是树部分的一个关键挑战。
此实现侧重于 Python 中的简单级逻辑。
在我们提供的解决方案中,我们优先考虑技术准确性和代码可读性。
2. Real-World Applications
3. Visual Intuition
可视化 BST 最低公共祖先的逻辑流程。
4. Prerequisites
5. Step-by-Step Thinking
1. Understand the problem
仔细阅读 BST 的最低共同祖先的问题陈述。
2. Formulate brute force
起草一个简单的迭代解决方案。
3. Identify inefficiency
寻找冗余计算。
4. Optimize search path
使用散列或排序来加速该过程。
5. Final Implementation
清理生产标准代码。
问题陈述
给定二叉搜索树 (BST),找到 BST 中两个给定节点的最低公共祖先 (LCA) 节点。
根据 LCA 的定义:“最低公共祖先被定义为两个节点 p 和 q 之间的最低公共祖先,作为 T 中同时具有 p 和 q 作为后代的最低节点(其中我们允许一个节点是其自身的后代)。”
BST 被表示为一个级别顺序列表。实现一个函数 lowestCommonAncestor(root: list, p: int, q: int) -> int 返回 LCA 节点的值。
- •The number of nodes in the tree is in the range [2, 100000]
- •-1000000000 <= Node.val <= 1000000000
- •All Node.val are unique
- •p != q
- •p and q will exist in the BST
示例
[6,2,8,0,4,7,9,None,None,3,5], 2, 8
6
The LCA of nodes 2 and 8 is 6, which is the root.
[6,2,8,0,4,7,9,None,None,3,5], 2, 4
2
The LCA of nodes 2 and 4 is 2, since a node can be a descendant of itself.
[2,1], 2, 1
2
The LCA of nodes 2 and 1 is 2.
Need a Hint?
Edge Cases to Watch
- 空输入结构
- 单元素输入
- 大数值范围
准备好解决了吗?
Open the problem in PyRun's browser-based Python editor. Your code runs fully offline — no server required.
面试见解和变化
复杂性分析分解
为什么时间: Directly evaluates all possibilities.
为什么选择太空: Uses standard local memory.
为什么时间: Optimized paths reduce total operations.
为什么选择太空: May trade memory for speed.
优化解决方案Python代码
优化解决方案Python代码
def lowest_common_ancestor_opt(root, p, q):
if isinstance(root, list):
r = build_tree(root)
val_p = p[0] if isinstance(p, list) else p
val_q = q[0] if isinstance(q, list) else q
def find_node(node, val):
if not node: return None
if node.val == val: return node
return find_node(node.left, val) or find_node(node.right, val)
node_p = find_node(r, val_p) or TreeNode(val_p)
node_q = find_node(r, val_q) or TreeNode(val_q)
res = lowest_common_ancestor_opt_helper(r, node_p, node_q)
return res.val if res else None
return lowest_common_ancestor_opt_helper(root, p, q)
def lowest_common_ancestor_opt_helper(root: TreeNode, p: TreeNode, q: TreeNode) -> TreeNode:
curr = root
while curr:
if p.val > curr.val and q.val > curr.val:
curr = curr.right
elif p.val < curr.val and q.val < curr.val:
curr = curr.left
else:
return curr暴力破解代码(剧透保护)
暴力破解代码(剧透保护)
def lowest_common_ancestor_brute(root, p, q):
if isinstance(root, list):
r = build_tree(root)
val_p = p[0] if isinstance(p, list) else p
val_q = q[0] if isinstance(q, list) else q
def find_node(node, val):
if not node: return None
if node.val == val: return node
return find_node(node.left, val) or find_node(node.right, val)
node_p = find_node(r, val_p) or TreeNode(val_p)
node_q = find_node(r, val_q) or TreeNode(val_q)
res = lowest_common_ancestor_brute_helper(r, node_p, node_q)
return res.val if res else None
return lowest_common_ancestor_brute_helper(root, p, q)
def lowest_common_ancestor_brute_helper(root: TreeNode, p: TreeNode, q: TreeNode) -> TreeNode:
if not root or root == p or root == q:
return root
left = lowest_common_ancestor_brute_helper(root.left, p, q)
right = lowest_common_ancestor_brute_helper(root.right, p, q)
if left and right:
return root
return left or rightAlgorithm Pattern Checklist
When dealing with Trees data patterns.
- Are constraints clear?
- Is there a linear or logarithmic optimization possible?
PyRun is built and maintained by an independent solo developer. If this helped your interview prep, consider buying a coffee!
推荐的 Python 资源
通过相关的交互式教程、备忘单和代码比较来扩展您的知识。
Python 循环:For 和 While 循环解释
了解如何使用 Python 循环来迭代数据。通过交互式示例掌握 for 循环、while 循环、break、continue 和循环最佳实践。
如何在 Python 中查找列表的长度
了解如何使用 len() 函数在 Python 中查找列表的长度。了解 O(1) 时间复杂度和检查计数。
Python 字符串方法备忘单
Python 字符串操作的完整参考指南。掌握格式化、搜索、拆分、替换和检查字符串属性。
Python 与 JavaScript:哪种编程语言最好?
Python 和 JavaScript 的全面比较。探索语法差异、性能、用例(后端与前端)和编码示例。