题目链接:https://leetcode.com/problems/maximum-width-of-binary-tree/description/
求树的宽度,就是求树的每个层次的宽度,并返回层次最宽的那个宽度。例如树[1,3,2,5,3,null,9]
树的宽度为4。下面的代码本质上是树的层次遍历,levels存储树的层次遍历的结果,遍历完后levels为[ [1],[2,3],[4,5,7] ],levels中存储的是节点的编号(从上到下,从左到右依次编号),不是节点的值。
代码如下(本质上是树的层次遍历):
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def widthOfBinaryTree(self, root):
"""
:type root: TreeNode
:rtype: int
"""
if root==None:
return 0
nums=[]#存储节点编号
queues=[]#存储节点
levels=[]#存储层次遍历结果
heights=[]#存储节点的深度,由于在TreeNode中并没有存储树的深度,所以需要自己取存储
queues.append(root)
nums.append(1)
heights.append(1)
while len(queues)!=0:
present=queues.pop(0)#访问当前节点
num=nums.pop(0)#当前节点的编号
height=heights.pop(0)#当前节点的深度
if len(levels)<=height-1:#如果首次访问树的某一深度
levels.append([])
levels[height-1].append(num)
if present.left!=None:
queues.append(present.left)#加入队列中
nums.append(num*2)#左子树的节点编号为num*2
heights.append(height+1)#左子树的节点深度当前节点深度加1
if present.right!=None:
queues.append(present.right)#加入队列中
nums.append(num*2+1)#右子树的节点编号为num*2+1
heights.append(height+1)#
maxWidth=0
for level in levels:#寻找最宽的宽度
diff=level[-1]-level[0]+1
if diff>maxWidth:
maxWidth=diff
return maxWidth