实战小知识-----8.28-----二叉树的宽度

83 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 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;
    }

}