题目:
给定一个二叉树,编写一个函数来获取这个树的最大宽度。树的宽度是所有层中的最大宽度。这个二叉树与满二叉树(full binary tree)结构相同,但一些节点为空。
每一层的宽度被定义为两个端点(该层最左和最右的非空节点,两端点间的null节点也计入长度)之间的长度。
思路:
为树的每个节点进行编号,根节点从1开始编号
若当前节点的编号为i,则其左孩子节点的编号为2i,其右孩子节点的编号为2i+1
对二叉树进行层序遍历,更新res=max(res,每层最后一个节点的编号-每层第一个节点的编号+1)
解答:
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def widthOfBinaryTree(self, root: Optional[TreeNode]) -> int:
#编号,当前节点i,左孩子2*i,右孩子2*i+1
#BFS
if not root:
return 0
q=[(root,1)]
res=1
while q:
n=len(q)
for i in range(n):
cur,idx=q.pop(0)
if i==0:
tmp=idx
if i==n-1:
res=max(res,idx-tmp+1)
if cur.left:
q.append((cur.left,2*idx))
if cur.right:
q.append((cur.right,2*idx+1))
return res