Lowest Common Ancestor of a Binary Search Tree
找出二叉树中某两个节点的最近的祖先. 可以是节点本身.
思路
一个快速的解决方案
- 首先依赖搜索算法构建整个二叉树的父子关系列表
- 回溯寻找父亲关系图, 需要检索关系列表, 所以考虑用dict会快一些
我的解法
class Solution(object):
def lowestCommonAncestor(self, root, p, q):
"""
使用DFS实现
"""
stack = [(None, root)] #(parent, node_now)
relation = {}
for parent, node in stack:
relation[node] = parent
if node.left != None:
stack.append((node, node.left))
if node.right != None:
stack.append((node, node.right))
# 父子关系构建完毕
ancestor_p, ancestor_q = [p], [q]
for i in ancestor_p:
if relation[i] == None:
break
ancestor_p.append(relation[i])
for i in ancestor_q:
if relation[i] == None:
break
ancestor_q.append(relation[i])
# 貌似不能这样求交, 在我的电脑上是可以的
return zip(ancestor_p[::-1], ancestor_q[::-1])[-1][0]
今天有些头晕..
实际上如果上面的解法可以通过的话,
它是另外一道题的答案:
No.236 Lowest Common Ancestor of a Binary Tree
暂时想不出来错误在哪里….等会再改吧.
补充内容
因为我把二叉搜索树的题做成二叉树了…
需要补充二叉搜索树的内容. (留坑待填)
有个严重的错误
求交那里写错了. 交换顺序后结果并不对.
用基本循环逻辑重新实现了这一部分
class Solution(object):
def lowestCommonAncestor(self, root, p, q):
"""
使用DFS实现
# 009 - 235. Lowest Common Ancestor of a Binary Search Tree
"""
stack = [(None, root)] #(parent, node_now)
relation = {}
for parent, node in stack:
relation[node] = parent
if node.left != None:
stack.append((node, node.left))
if node.right != None:
stack.append((node, node.right))
# 父子关系构建完毕
ancestor_p, ancestor_q = [p], [q]
for i in ancestor_p:
if relation[i] == None:
break
ancestor_p.append(relation[i])
for i in ancestor_q:
if relation[i] == None:
break
ancestor_q.append(relation[i])
for i,j in zip(ancestor_p[::-1], ancestor_q[::-1])[::-1]:
if i == j:
break
return i
虽然通过了, 确实难以令人开心.

本文深入探讨了在二叉树结构中查找两个节点的最近公共祖先的问题,从构建父子关系列表到使用字典加速搜索过程,详细介绍了算法实现与优化。同时指出错误在于求交操作的实现,并提供了修正后的代码实现,确保了正确性和效率。
1万+

被折叠的 条评论
为什么被折叠?



