二叉树的宽度

时间:2018-07-13 19:25:38

标签: algorithm tree binary-tree

我们如何确定二叉树的宽度a。

一个简单的bin树

            O
           / \
          O   O
           \
            O
             \
              O
               \
                O

上述树的宽度为4

1 个答案:

答案 0 :(得分:0)

您可以使用递归函数,该函数为给定节点返回两个值:该节点处子树的范围向左(负数或零),以及向右的范围(零或正)。因此,对于问题中给出的示例树,它将返回-1和3。

当您知道左孩子和右孩子的程度时,找到这些扩展很容易。这就是递归开始的地方,实际上代表了深度优先遍历。

以下是该函数在Python中的外观:

def extents(tree):
    if not tree:
        # If a tree with just one node has extents 0 and 0, then "nothing" should
        #  have a negative extent to the right and a positive on the left, 
        #  representing a negative breadth
        return 1, -1
    leftleft, leftright = extents(tree.left)
    rightleft, rightright = extents(tree.right)
    return min(leftleft-1, rightleft+1), max(leftright-1, rightright+1)

宽度仅是上述函数返回的两个扩展区之间的差加上1(用于计算根节点):

def breadth(tree):
    leftextent, rightextent = extents(tree)
    return rightextent-leftextent+1

带有示例树的完整Python代码,具有6个节点作为输入:

from collections import namedtuple
Node =  namedtuple('Node', ['left', 'right'])

def extents(tree):
    if not tree:
        return 1, -1
    leftleft, leftright = extents(tree.left)
    rightleft, rightright = extents(tree.right)
    return min(leftleft-1, rightleft+1), max(leftright-1, rightright+1)

def breadth(tree):
    left, right = extents(tree)
    return right-left+1

# example tree as given in question
tree = Node(
    Node(
        None,
        Node(None, Node(None, Node(None, None)))
    ),
    Node(None, None)
)

print(breadth(tree)) # outputs 4