当前位置: 首页 > article >正文

BFS求树的宽度——结合数组建树思想算距离

二叉树最大宽度

https://leetcode.cn/problems/maximum-width-of-binary-tree/description/
在这里插入图片描述

1、考虑树的宽度一定是在一层上的所以进行BFS,树的BFS不建议直接使用队列,每次add/offer然后poll/remove,这样子层级关系不好显示。我们可以定义两个数组,每次从List里面取出所有的元素,这些元素就是一层上的所有的节点。然后进行遍历将子节点插入到另外一个数组,这样子会非常清晰。
2、那如何计算宽度?我们考虑利用数组建树的思想。比如[1,2,3]可以构成一颗二叉树,1是根节点,2和3是孩子,二者的下标分别是×2和×2+1,这样子不同的节点就有了自己的编号。而两个节点的距离就是下标差。最大的宽度不就是每一个List最后一个元素和第一个元素的下标差的最大值嘛。(遍历每一层取最大即可)
扩展:字节面试题,Z字形遍历树,利用上面的思想非常简单,只需要一个变量每多一层判断奇数还是偶数,对List正着或者倒着遍历。

class Solution {
    //主要还是考虑API的使用
    public int widthOfBinaryTree(TreeNode root) {
        //思路BFS加一个变量同时记录下来两个节点的数据差,然后就可以直接做差得到宽度了
        //由于要一层一层的取,所以拿list更加方便
        List<Pair<TreeNode, Integer>> list = new ArrayList<>();
        int ans = 0;
        list.add(new Pair<TreeNode, Integer>(root,1));
        while(!list.isEmpty()){
            List<Pair<TreeNode, Integer>> temp = new ArrayList<>();
            for(int i=0;i<list.size();i++){
                Pair<TreeNode, Integer> p = list.get(i);
                TreeNode t = p.getKey();
                Integer index = p.getValue();
                TreeNode left = t.left;
                TreeNode right = t.right;
                if(left!=null) temp.add
                    (new Pair<TreeNode, Integer>(left,index*2));
                if(right!=null) temp.add
                    (new Pair<TreeNode, Integer>(right,index*2+1));
                ans = Math.max(ans,(i==0?1:1+
                    index-list.get(0).getValue()));
            }
            list = temp;
        }
        return ans;
    }
}

http://www.kler.cn/a/157258.html

相关文章:

  • OpenCV学习——图像融合
  • Mysql高级部分总结(二)
  • vue3封装而成的APP ,在版本更新后,页面显示空白
  • Move AI技术浅析(二):输入与预处理
  • Java爬虫:速卖通(AliExpress)商品评论获取指南
  • sqoop的参数有哪些?
  • GPT市场将取代插件商店 openAI已经关闭plugins申请,全部集成到GPTs(Actions)来连接现实世界,可以与物理世界互动了。
  • 不再只是android,华为自爆Harmony将对标iOS
  • C# AES-128-CBC 加密
  • 【电源专题】什么是电源管理
  • OpenCV快速入门:移动物体检测和目标跟踪
  • python 运用pandas 库处理excel 表格数据
  • C++11的互斥量
  • C语言枚举
  • react-native实践日记--3.ui-kitten中的button设置字体颜色无效
  • AI医疗交流平台【Docola】申请823万美元纳斯达克IPO上市
  • json序列化时Long类型转换为String类型
  • Day50力扣打卡
  • Python类型注解必备利器:typing模块解读指南
  • MC:aternos使用报告(一)
  • nginx部署多个vue或react项目
  • 回溯法及例题(C++实现)
  • 大三上oracle数据库期末复习
  • dp-拦截导弹2
  • 计算机辅助药物设计AIDD-小分子-蛋白质|分子生成|蛋白质配体相互作用预测
  • RWA+AI 叙事下的 ProsperEx,对 Web3 时代交易的重新定义