二叉树的宽度指所有层中真实节点数量的最大值,通过层序遍历中每次记录队列长度获取每层节点数,边遍历边更新最大值,空树返回0,单节点树宽度为1。
二叉树的“宽度”通常指**所有层中节点数量的最大值**,也就是某一层里实实在在存在的非空节点个数最多是多少。这和 LeetCode 662 题中的“最大宽度”(含虚拟空位编号差)不同——这里只统计真实存在的节点,不考虑结构空缺。 掌握这个统计,关键在**层序遍历过程中的节点计数控制**,而不是堆栈或递归深度。下面直接说实用技巧:
用队列大小动态抓取每层节点数
层序遍历时,每轮处理前先记下当前队列长度,它就等于「本层真实节点数」:
- 根节点入队后,队列长度为 1 → 第一层有 1 个节点
- 处理完这一轮(出队 1 次),把它的左右孩子(若存在)都入队 → 新入队节点全属于下一层
- 下一轮开始前,再读队列长度 → 就是第二层的节点总数
无需额外变量标记层数、无需哈希表存层级映射,靠队列长度本身就能精准分层。
边遍历边更新最大值,一次到位
每处理完一层,就把当前层节点数和已知最大值比较并更新:
- 初始化 maxWidth = 0
- 每层结束时:maxWidth = Math.max(maxWidth, 当前层节点数)
- 遍历完毕即得答案,无须事后扫描
注意边界:空树返回 0,单节点树宽度为 1
代码开头加判空即可,避免后续逻辑异常:
- if (root == null) return 0;
- 队列初始只加 root,后续仅对非空子节点入队
- 这样天然过滤掉 null 节点,计数完全反映真实结构
参考精简实现(Java)
以下逻辑清晰、无冗余状态:
public int widthOfBinaryTree(TreeNode root) {
if (root == null) return 0;
Queue<treenode> queue = new LinkedList();
queue.offer(root);
int maxWidth = 0;
while (!queue.isEmpty()) {
int levelSize = queue.size(); // 当前层真实节点数
maxWidth = Math.max(maxWidth, levelSize);
for (int i = 0; i </treenode>










