携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第30天,点击查看活动详情
痛苦周日,因为需要衔接着周一,下周需要做单独部署的麻烦事情,想想那个也是想提桶的
二叉树的宽度
该题出自力扣的662题 —— 二叉树的宽度【中等题】
审题
给你一棵二叉树的根节点 root ,返回树的 最大宽度 。
- 树的 最大宽度 是所有层中最大的 宽度 。
- 每一层的 宽度 被定义为该层最左和最右的非空节点(即,两个端点)之间的长度。将这个二叉树视作与满二叉树> - 结构相同,两端点间会出现一些延伸到这一层的 null 节点,这些 null 节点也计入长度。
- 题目数据保证答案将会在 32 位 带符号整数范围内。
- 该题的题意很简单也很简单,不难理解,就是给出一个二叉树的根节点,返回树的最大宽度
- 所谓的最大宽度就是节点宽度的最大距离,包括了空节点
- 很明显的,直接就想到了层序遍历,计算出层的每一层的最大宽度,并最终返回最大值
- 在层序的过程中,面临了一个问题 —— 空节点的存在,如果决定空节点的去向
- 首先层序会入栈的方式执行,那么肯定会对节点的 子节点做入栈处理
- 求每一层的宽度时,因为两端点间的 null 节点也需要计入宽度,因此可以对节点进行编号。
- 一个编号为 index 的左子节点的编号记为 2×index,右子节点的编号记为 2×index+1,计算每层宽度时,用每层节点的最大编号减去最小编号再加 11 即为宽度。
编码
class Solution {
public int widthOfBinaryTree(TreeNode root) {
int ans = 0;
Deque<Pair<Integer, TreeNode>> queue = new ArrayDeque<>();
queue.addLast(new Pair<>(1, root));
while (!queue.isEmpty()) {
int max = 0, min = 0;
for (int i = 0, n = queue.size(); i < n; i++) {
Pair<Integer, TreeNode> pair = queue.removeFirst();
int code = pair.getKey();
TreeNode node = pair.getValue();
if (i == 0) {
min = code;
}
if (i == n - 1) {
max = code;
}
if (node.left != null) {
queue.addLast(new Pair<>(code << 1, node.left));
}
if (node.right != null) {
queue.addLast(new Pair<>((code << 1) + 1, node.right));
}
}
ans = Math.max(ans, max - min + 1);
}
return ans;
}
}