【二叉树】leetcode662.二叉树最大宽度

461 篇文章 1 订阅
125 篇文章 2 订阅

题目:
给定一个二叉树,编写一个函数来获取这个树的最大宽度。树的宽度是所有层中的最大宽度。这个二叉树与满二叉树(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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值