优选算法-队列+宽搜(BFS):72.二叉树的最大宽度

题目链接:662. 二叉树最大宽度(中等)

算法原理:

解法一:硬来(超时)

解法二:利用数组存储二叉树的方式,给节点编号

击败4.01%

时间复杂度O(N)

Java代码:

java 复制代码
/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 王洋
 * Date: 2025-09-17
 * Time: 14:09
 */

import javax.swing.tree.TreeNode;
import java.util.ArrayList;
import java.util.List;

/**
 * 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 {
    //662. 二叉树最大宽度
    //IDEA没有内置Pair,需要自己实现
    class Pair<K,V>{
        private K key;
        private V value;
        public Pair(K key,V value){
            this.key=key;
            this.value=value;
        }
        public K getKey(){
            return key;
        }
        public V getValue(){
            return value;
        }
    }
    public int widthOfBinaryTree(TreeNode root) {
        if(root==null) return 0;
        List<Pair<TreeNode,Integer>> q=new ArrayList<>();
        //Pair<TreeNode,Integer>这一整体类似数据类型
        q.add(new Pair<TreeNode,Integer>(root,1));int ret=0;
        while(!q.isEmpty()){
            //更新宽度
            Pair<TreeNode,Integer> left=q.get(0);
            Pair<TreeNode,Integer> right=q.get(q.size()-1);
            ret=Math.max(ret,right.getValue()-left.getValue()+1);

            List<Pair<TreeNode,Integer>> tmp=new ArrayList<>();
            for(Pair<TreeNode,Integer> t:q){//从当前层取出每个对
                TreeNode node=t.getKey();
                int index=t.getValue();
                if(node.left!=null)
                    tmp.add(new Pair<TreeNode,Integer>(node.left,2*index));
                if(node.right!=null)
                    tmp.add(new Pair<TreeNode,Integer>(node.right,2*index+1));
            }
            q=tmp;//覆盖
        }
        return ret;
    }
}
相关推荐
1024奇点4 小时前
【仓颉语言入门 · 第二篇 第 22 课】
开发语言·ide·开源
Warren2Lynch5 小时前
C4 模型详解:利用 Visual Paradigm 可视化软件架构的综合指南
开发语言·uml
天河归来5 小时前
第三方接口不稳定,如何让核心任务继续完成
java·大数据
Knight_AL6 小时前
Java 文件下载时文件名中的 `#` 被转换成 `%23`?一次 URL 编码与解码问题排查
java·开发语言
ZhengEnCi6 小时前
GPT-6 Astra 爆改 Qwen 权重真有那么神吗:权重空间编程 0.016% 参数的真相
算法·架构
FRing037 小时前
vue2干货总结2(v-bind、v-for、v-model、指令修饰符、v-bind操作class和style)
开发语言·前端·vue.js·vue2
罗西的思考7 小时前
【轻量化复刻大模型 / KIMI K3】KDA(Kimi Delta Attention):并行
人工智能·算法·机器学习
by209997 小时前
C++ 智能指针的所有权与使用
开发语言·c++·经验分享
砚底藏山河7 小时前
python量化自定义周期 K 线合成
java·开发语言·数据库·python·金融
IT召唤狮7 小时前
开源企业级零信任项目Pangolin,零信任能挡住PHP核弹漏洞吗?
开发语言·开源·php