我们如何确定二叉树的宽度a。
一个简单的bin树
O
/ \
O O
\
O
\
O
\
O
上述树的宽度为4
答案 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