python中二叉搜索树的总深度

时间:2018-02-24 02:03:12

标签: python tree binary-search-tree

我试图在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。我需要它来计算运行时间的比率

1 个答案:

答案 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()