LeetCode 662. 二叉树的最大宽度

文章目录

  • [LeetCode 662. 二叉树的最大宽度](#LeetCode 662. 二叉树的最大宽度)

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 代码

go 复制代码
/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
type pair struct {
    node  *TreeNode
    index int
}

func widthOfBinaryTree(root *TreeNode) int {
    ans := 1
    q := []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
}
相关推荐
仪器科学与传感技术博士24 分钟前
python:前馈人工神经网络算法之实战篇,以示例带学,弄明白神经网络算法应用的思路、方法与注意事项等
人工智能·python·深度学习·神经网络·算法·机器学习
云边有个稻草人2 小时前
【C++】第二十一节—一文详解 | 红黑树实现(规则+效率+结构+插入+查找+验证)
算法·红黑树·红黑树的插入·红黑树的结构·红黑树完整代码·红黑树的效率·红黑树的查找
仟濹3 小时前
【C/C++】整数超过多少位时用「高精度」
c语言·c++·算法
DIY机器人工房6 小时前
一个可以检测本机的字节顺序,并对任意数据进行字节顺序的反转操作的代码。
嵌入式硬件·算法·嵌入式·diy机器人工房
杰克尼7 小时前
11. 盛最多水的容器
算法·leetcode·职场和发展
程序员Xu9 小时前
【OD机试题解法笔记】查找接口成功率最优时间段
笔记·算法
技术思考者10 小时前
Leetcode - 反转字符串
数据结构·算法·leetcode
SKYDROID云卓小助手11 小时前
无人设备遥控器之多设备协同技术篇
网络·人工智能·嵌入式硬件·算法·信号处理
熬了夜的程序员11 小时前
【华为机试】34. 在排序数组中查找元素的第一个和最后一个位置
数据结构·算法·华为od·华为·面试·golang
phltxy12 小时前
ArrayList与顺序表
java·算法