662. 二叉树最大宽度

题目

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

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

每一层的 宽度 被定义为该层最左和最右的非空节点(即,两个端点)之间的长度。将这个二叉树视作与满二叉树结构相同,两端点间会出现一些延伸到这一层的 null 节点,这些 null 节点也计入长度。

题目数据保证答案将会在 32 位 带符号整数范围内。

示例 1:

csharp 复制代码
输入: root = [1,3,2,5,3,null,9]
输出: 4
解释: 最大宽度出现在树的第 3 层,宽度为 4 (5,3,null,9) 。

代码与解析

不得不说三叶姐姐真牛掰,我有想过用高度和编号,但就卡在了编号怎么弄。三叶姐姐解答: 左侧编号是u << 1 , 右侧编号是 u<<1 | 1 ,就是扩大2倍,|1是将最高位置为1,例如第二层,左边就是01,右边就是11这样子

java 复制代码
/**
 * 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 {
    Map<Integer, Integer> map = new HashMap<>();
    int ans = 0;
    public int widthOfBinaryTree(TreeNode root) {
        dfs(root, 1, 0);
        return ans;
    }
    public void dfs(TreeNode node, int u, int height) {
        if(node == null)    return;
        if(!map.containsKey(height)) map.put(height, u);
        u = u - map.get(height) + 1; //防止编号溢出
        ans = Math.max(ans, u);
        dfs(node.left, u << 1, height + 1);
        dfs(node.right, u << 1 | 1, height + 1);
    }
}
相关推荐
野犬寒鸦2 小时前
从零起步学习MySQL || 第十章:深入了解B+树及B+树的性能优势(结合底层数据结构与数据库设计深度解析)
java·数据库·后端·mysql·1024程序员节
上进小菜猪2 小时前
智能信创新范式:浙江省人民医院的全栈国产化与智能数据底座实践
后端
没有bug.的程序员3 小时前
Spring 常见问题与调试技巧
java·后端·spring·动态代理·1024程序员节
黎燃3 小时前
构筑自主可控医疗生态-数智融合新引擎-医疗全栈信创跃迁
后端
R.lin3 小时前
OSS服务模块-基于数据库配置的Java OSS服务解决方案,支持MinIO、七牛云、阿里云和腾讯云
java·数据库·后端·mysql
R.lin4 小时前
使用 Undertow 替代 Tomcat
java·后端·tomcat
Mintopia4 小时前
🇨🇳 Next.js 在国内场景下的使用分析与实践指南
前端·后端·全栈
程序员三明治5 小时前
Spring AOP:注解配置与XML配置双实战
java·后端·spring·代理模式·aop·1024程序员节
绝无仅有5 小时前
京东面试题解析:同步方法、线程池、Spring、Dubbo、消息队列、Redis等
后端·面试·github
非凡ghost5 小时前
Tenorshare 4DDiG(数据恢复软件) 最新版
前端·javascript·后端