当前位置: 首页 > news >正文

LeetCode 662. 二叉树的最大宽度

文章目录

  • LeetCode 662. 二叉树的最大宽度
    • 题目描述
    • 思路
    • Golang 代码

LeetCode 662. 二叉树的最大宽度

在这里插入图片描述
记录一次刷题的感悟。这道题目是我人生第一次面试的时候的手撕题目,但临场的时候面试官没有为难我,他考察的问题是求二叉树的最大宽度,但是不需要考虑 null 结点,也就是空的结点不计入宽度当中。

当我再次刷到这道题,发现当初面试的时候自己的理解有问题,计算宽度的时候应该考虑 null 结点,比如对于下面这样一棵树:
请添加图片描述
这棵树的最大宽度就是 7,而不是 2。

有了这一层限制,这道题目就具有了一定的难度,下面开始分析解这道题的思路。

题目描述

请添加图片描述

思路

我们使用 BFS 来解这道问题。

其实从后验的角度来说,这道题目没有什么难度,但是难就难在临场想不到这道题的正确思路。

正确的思路其实是,新开一个数据结构,同时保存二叉树的结点以及当前节点的编号。每一次计算一层的最大的宽度时,计算队列头和队列尾两个二叉树结点之间编号的差值。

二叉树结点的编号计算规则如下:对于当前的结点 i i i,它的左孩子结点编号为 2 × i 2 \times i 2×i,右孩子结点编号为 2 × i + 1 2 \times i + 1 2×i+1。基于二叉树结点的编号,我们甚至可以在一个数组当中存储二叉树。堆排序正是利用了这条性质,在数组当中利用二叉树建堆来实现最大堆或最小堆。

Golang 代码

/*** Definition for a binary tree node.* type TreeNode struct {*     Val int*     Left *TreeNode*     Right *TreeNode* }*/
type pair struct {node  *TreeNodeindex int
}func widthOfBinaryTree(root *TreeNode) int {ans := 1q := []pair{}q = append(q, pair{root, 1})for len(q) > 0 {ans = max(ans, q[len(q) - 1].index -  q[0].index + 1)currLen := len(q)for i := 0; i < currLen; i ++ {p := q[0]; q = q[1:]if p.node.Left != nil {q = append(q, pair{p.node.Left, 2 * p.index})}if p.node.Right != nil {q = append(q, pair{p.node.Right, 2 * p.index + 1})}}}return ans
}

相关文章:

  • IP 地理库的使用指南:从基础应用到深度实践​
  • 国产MCU A\B SWAP原理及实操
  • 生产事故复盘--小问题引发的大事故
  • Kafka存储设计深度剖析:日志、索引与文件管理的底层奥秘
  • JavaScript 中 call、apply 和 bind 的区别
  • Unity_VR_如何用键鼠模拟VR输入
  • SSH远程连接
  • Linux 进程概念
  • 【蓝牙】手机连接Linux系统蓝牙配对,Linux Qt5分享PDF到手机
  • 如何将缓存存到客户端浏览器上呢
  • [11-5]硬件SPI读写W25Q64 江协科技学习笔记(20个知识点)
  • VR看房:重塑房地产行业生态的技术革命
  • Vim-vimrc 快捷键映射
  • Minio使用https自签证书
  • Excel学习01
  • 面试题:设计一个分布式“附近的人”功能(如微信附近的人、交友应用位置匹配)
  • 数字华容道智力小游戏微信流量主小程序开源
  • ros中相机话题在web页面上的显示,尝试js解析sensor_msgs/Image数据
  • DHCP服务
  • 亚马逊云科技中国峰会召开 解码Agentic AI时代企业加速创新路径
  • 有哪些网站可以做家教/推广资讯
  • 青岛 网站建设/中国国家培训网正规吗
  • 做华为网站的还有哪些功能吗/建立网站需要什么条件
  • 做一个配送网站/seo优化网站的手段
  • 国内做网站的龙头企业/百度关键词优化公司
  • 如何架设php网站/杭州网站运营十年乐云seo