您的位置:首页 > 其它

LeetCode: 009-Lowest Common Ancestor of a Binary Search Tree

2016-01-08 14:34 381 查看

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


虽然通过了, 确实难以令人开心.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: