• 二叉树最大宽度(java 算法 bfs)


    给你一棵二叉树的根节点 root ,返回树的 最大宽度 。

    树的 最大宽度 是所有层中最大的 宽度 。

    每一层的 宽度 被定义为该层最左和最右的非空节点(即,两个端点)之间的长度。将这个二叉树视作与满二叉树结构相同,两端点间会出现一些延伸到这一层的 null 节点,这些 null 节点也计入长度。
    题目数据保证答案将会在 32 位 带符号整数范围内。
    在这里插入图片描述

    示例 1:
    输入:root = [1,3,2,5,3,null,9]
    输出:4
    解释:最大宽度出现在树的第 3 层,宽度为 4 (5,3,null,9) 。
    在这里插入图片描述

    示例 2:
    输入:root = [1,3,2,5,null,null,9,6,null,7]
    输出:7
    解释:最大宽度出现在树的第 4 层,宽度为 7 (6,null,null,null,null,null,7) 。
    在这里插入图片描述

    示例 3:
    输入:root = [1,3,2,5]
    输出:2
    解释:最大宽度出现在树的第 2 层,宽度为 2 (3,2) 。

    解题思路(其中空节点的判定我个人还是挺无语的):
    假设满二叉树表示成数组序列, 根节点所在的位置为1, 则任意位于i节点的左右子节点的index为2i, 2i+1
    用一个List保存每层的左端点, 易知二叉树有多少层List的元素就有多少个. 那么可以在dfs的过程中记录每个
    节点的index及其所在的层level, 如果level > List.size()说明当前节点就是新的一层的最左节点, 将其
    加入List中, 否则判断当前节点的index减去List中对应层的最左节点的index的宽度是否大于最大宽度并更新

    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode() {}
     *     TreeNode(int val) { this.val = val; }
     *     TreeNode(int val, TreeNode left, TreeNode right) {
     *         this.val = val;
     *         this.left = left;
     *         this.right = right;
     *     }
     * }
     */
     
    class Solution {
    
        private int maxQian = 0;
    
        public int widthOfBinaryTree(TreeNode root) {
            dfs(root,1,1,new ArrayList<>());
            return Qian;
        }
        private void dfs(TreeNode r,int level,int index,List<Integer> left){
            if(r == null){
                return;
            }
            if(level > left.size()) {
            	left.add(index)
            };
            maxQian = Math.max(maxQian, index - left.get(level-1) + 1);
            dfs(r.left, level+1, index*2, left);
            dfs(r.right, level+1, index*2+1, left);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
  • 相关阅读:
    计算机网络的体系结构
    Nginx入门
    解决新版 Kali Linux 在 VMware 虚拟机中设置共享文件夹后依旧寻找不到的问题
    安卓APP(3)——安卓布局控件
    上周热点回顾(10.16-10.22)
    2023国赛数学建模C题思路模型代码 高教社杯
    C#:实现字符串转整形算法(附完整源码)
    kafka系列(一)安装使用及基本原理
    一切测试的基础——测试用例设计
    C++多线程同步(上)
  • 原文地址:https://blog.csdn.net/weixin_51423778/article/details/126556179