二叉树的宽度
breadth of a binary tree
我们如何确定二叉树的广度a。
一个简单的 bin 树
O
/ \
O O
\
O
\
O
\
O
上面树的宽度是4
您可以使用递归函数,该函数 return 给定节点的两个值:该节点处子树向左的范围(负数或零)和向右的范围(零或正数)。因此,对于问题中给出的示例树,它将 return -1 和 3.
当您知道左侧 child 和右侧 child 的范围时,找到这些范围很容易。这就是递归开始的地方,它实际上代表了一个 depth-first 遍历。
下面是该函数在 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)
广度就是上述函数return两个extents之差加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
我们如何确定二叉树的广度a。
一个简单的 bin 树
O
/ \
O O
\
O
\
O
\
O
上面树的宽度是4
您可以使用递归函数,该函数 return 给定节点的两个值:该节点处子树向左的范围(负数或零)和向右的范围(零或正数)。因此,对于问题中给出的示例树,它将 return -1 和 3.
当您知道左侧 child 和右侧 child 的范围时,找到这些范围很容易。这就是递归开始的地方,它实际上代表了一个 depth-first 遍历。
下面是该函数在 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)
广度就是上述函数return两个extents之差加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