https://leetcode-cn.com/problems/maximum-width-of-binary-tree/
求一颗二叉树的最大宽度
最开始用层级遍历的方式,记录一层的长度,将空节点的也放入队列中计算宽度,当二叉树过大时,会超出时间限制。
原代码:
def widthOfBinaryTree(self, root):
"""
:type root: TreeNode
:rtype: int
"""
if not root:
return 0
queue = [root]
res= []
while queue:
tmp = ''
layer = []
while queue:
node = queue.pop(0)
if node:
tmp += '1'
layer.append(node.left)
layer.append(node.right)
else:
tmp += ' '
layer.append(None)
layer.append(None)
if not tmp.strip():
break
queue = layer
res.append(tmp.strip())
print(res)
return max([len(layer) for layer in res])
为了减少时间,需要避免对节点为空的情况进行考虑,当二叉树的父节点位置为n时,二叉树的子节点的位置分别为2*n和2*n+1。因此只将非空节点与对应位置存入队列,计算每一层位置之间的距离即可。
def widthOfBinaryTree(self, root):
"""
:type root: TreeNode
:rtype: int
"""
if not root:
return 0
queue = [(root, 0)]
max_wid = 1
while queue:
layer = []
while queue:
node = queue.pop(0)
if node[0].left:
layer.append((node[0].left, node[1]*2))
if node[0].right:
layer.append((node[0].right, node[1]*2+1))
if layer:
queue = layer
max_wid = max(max_wid, layer[-1][1] - layer[0][1] + 1)
return max_wid