![](/img/trans.png)
[英]To Find Lowest Common Ancestor in a Tree[Binary] but with multiple Node IN python?
[英]Python: Lowest Common Ancestor in a binary tree, challenge on CodeEval
首先,我知道還有許多其他線程可以處理此問題。 我想知道的是為什么在CodeEval上提交我的解決方案時,其排名似乎沒有達到100%。 它僅排名70%。 當我在本地環境上對其進行測試時,它可以很好地應對我所提出的所有測試情況。
我知道我的解決方案不是最有效的。 我試圖做的是自己提出一種解決方案,我會理解的。 我最終將其與其他人進行比較。 但是在此之前,有人可以解釋一下我在做什么錯嗎?
class binary_tree(object):
def __init__(self, value=None, left=None, right=None):
self.value=value
self.left=left
self.right=right
def insert(self, num):
#print "...now:", num
if self.value==num:
return
else:
#print "descending from", self.value
if num<self.value:
if self.left:
#print "descending to left"
self.left.insert(num)
else:
#print "! found empty left"
self.left=binary_tree(num)
else:
if self.right:
#print "descending to right"
self.right.insert(num)
else:
#print "! found empty right"
self.right=binary_tree(num)
def tree_from_list(self, value, numbers):
self.value=value
for num in numbers:
self.insert(num)
def __repr__(self,depth=0):
rtn=""
rtn+="\t"*depth+" "+str(self.value)+"\n"
depth+=1
if self.left:
rtn+="\t"*depth+" left: "
rtn+=self.left.__repr__(depth)
if self.right:
rtn+="\t"*depth+" right: "
rtn+=self.right.__repr__(depth)
return rtn
def find_parent_depth(self, num, depth=0):
if self.left and self.left.value==num:
#returns a list of two values, the first one being
#the depth of the parent, and the second the value
#itself. depth starts at 0, and increases as we descend
return [depth, self.value]
elif self.right and self.right.value==num:
return [depth, self.value]
else:
depth+=1
#checks for which path to descend on
if num<self.value:
if self.left:
return self.left.find_parent_depth(num, depth)
else:
return self.value
else:
if self.right:
return self.right.find_parent_depth(num, depth)
else:
return self.value
#lca = lowest common ancestor
def lca(self, v1, v2):
parent1=self.find_parent_depth(v1)
parent2=self.find_parent_depth(v2)
#checks for which parent has lower depth
if parent1[0]<parent2[0]:
#searches for ancestors till it reaches the same depth level
while parent1[0]!=parent2[0]:
parent2=self.find_parent_depth(parent2[1])
#checks if the ancestors coincide at that depth
if parent1[1]==parent2[1]:
#if they do, returns the parent value
#THIS IS IT
return parent1[1]
#if it doesn't, we need to raise the level of the lowest one
#and do it all over again
else:
return self.lca(parent1[1], parent2[1])
else:
#searches for ancestors till it reaches the same depth level
while parent2[0]!=parent1[0]:
parent1=self.find_parent_depth(parent1[1])
#checks if the ancestors coincide at that depth
if parent1[1]==parent2[1]:
#if they do, returns the parent value
#THIS IS IT
return parent1[1]
#if it doesn't, we need to raise the level of the lowest one
#and do it all over again
else:
return self.lca(parent2[1], parent1[1])
dis=binary_tree()
dis.tree_from_list(30, [8, 52, 3, 20, 10, 29, 12, 90, 89, 1])
print dis.lca(89, 12)
我有一個類似的問題。 鑒於:
30
_|___
| |
8 52
_|___
| |
3 20
_|___
| |
10 29
我的掛斷與LCA定義有關。
我發現20和29的最低共同祖先是20,而不是我最初認為的方向示例中的8。 另一個示例是LCA為8,而20為8。
調整代碼后,我的提交通過了100%。
希望這可以幫助。 干杯!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.