我试图在python中找到BST的总深度(这样根的深度为1,其子深度为2,子深度为3等),总数是加在一起的所有深度。我现在已经尝试了大约5个小时,但无法理解。这是我到目前为止生成的代码
class BinaryTreeVertex:
'''vertex controls for the BST'''
def __init__(self, value):
self.right = None
self.left = None
self.value = value
...
def total_Depth(self):
print ("val:", self.value)
if self.left and self.right:
return (self.left.total_Depth()) + 1 and (self.right.total_Depth()) + 1
elif self.left:
return 1 + self.left.total_Depth()
elif self.right:
return 1 + self.right.total_Depth()
else:
return 1
...
tree = BinarySearchTree()
arr = [6,10,20,8,3]
for i in arr:
tree.insert(i)
tree.searchPath(20)
print (tree.total_Depth()) #this calls the total_depth from vertex class
生成的树然后看起来像这样。
6 # Depth 1
___|___
3 10 # Depth 2
___|__
8 20 # Depth 3
但是当我运行它时会打印出来:
val: 6
val: 3
val: 10
val: 8
val: 20
3
实际上3应该是这棵树的11,但我无法弄清楚如何得到它。请帮忙
编辑:为了澄清,我不是在寻找最大深度,我知道如何找到它。我需要我解释的总深度,其中深度是树的水平。这里将是11,因为6将具有深度1,3和10深度2,以及8和20深度3,其中1 + 2 + 2 + 3 + 3 = 11。我需要它来计算运行时间的比率
答案 0 :(得分:1)
你的问题来自这条线。
return (self.left.total_Depth()) + 1 and (self.right.total_Depth()) + 1
使用and
将返回提供的最左侧的虚假值,如果它们都是真的,则返回最右侧。在这种情况下,它实际上最终总是返回self.right.total_Depth() + 1
。
我建议通过关键字参数跟踪节点深度,我称之为_depth
以强调它应该是私有的,即不是由用户提供。
class BinaryTreeVertex:
...
def total_depth(self, _depth=1):
if self.left and self.right:
return self.left.total_depth(_depth=_depth + 1) \
+ self.right.total_depth(_depth=_depth + 1) \
+ _depth
elif self.left:
return _depth + self.left.total_depth(_depth=_depth + 1)
elif self.right:
return _depth + self.right.total_depth(_depth=_depth + 1)
else:
return _depth
你也可以这样缩短它。
def total_depth(self, _depth=1):
left_depth = self.left.total_depth(_depth=_depth + 1) if self.left else 0
right_depth = self.right.total_depth(_depth=_depth + 1) if self.right else 0
return left_depth + right_depth + _depth
在这两种情况下,您都可以获得这样的总深度。
tree.total_depth()