阅读 72
[路飞]_算法·每日解读--二叉树的最大宽度

[路飞]_算法·每日解读--二叉树的最大宽度

「这是我参与11月更文挑战的第6天,活动详情查看:2021最后一次更文挑战

题解105: leetcode-二叉树最大宽度

给定一个二叉树,编写一个函数来获取这个树的最大宽度。树的宽度是所有层中的最大宽度。这个二叉树与满二叉树(full binary tree)结构相同,但一些节点为空。

每一层的宽度被定义为两个端点(该层最左和最右的非空节点,两端点间的null节点也计入长度)之间的长度。

题意中要能够理解两点:①树的宽度是所有层中的最大宽度,②每一层的宽度为两个端点之间的长度


接下来选择解题方法,理清思路:

  1. 在解题之前我们有必要先了解一下,二叉树(满二叉树)的节点分布规律:

    • root的所有几点进行编号,root为1,root.left为2 ,root.right为3,依次从左到右进行下去
    • 可得出结论:root.leftindex = root的index*2,root.rightindex = rootindex*2+1
  2. 创建wilhe循环,在while作用域内定义temp临时节点保存空容器,在内部定义可以确保每次循环都是为空数组,

  3. 在这里我们不仅需要进行层数的统计,同时也需要进行每层节点个数的统计,合理的选择使用二位数组进行数据的存储

    var widthOfBinaryTree = function (root){
        if(!root) return 0;
        let max = 1;//定义变量来记录宽度的最大值,每层的序号相减完毕后和max进行比较获取最大值
        let que = [[0,root]]; //定义应该二维数组存储当前的序号和存入的节点
        while(que.length){
            let width = que[que.length -1][0] - que[0][0]+1; //宽度为rIndex-lIndex+1
            if(width > max) max = width
            let temp = []
            //二维数组遍历
            for (const [i,q] of que){
                q.left && temp.push([i*2,q.left])  //在这里判断root的左节点是否存在,如果存在,则将左节点push到temp,同时根据二叉树节点分布规律,让i*2
                q.right && temp.push([i*2+1,q.right])//同理,push右节点
            }
            que = temp
        }
        return Number(max)
    }
    复制代码

    在这里,一定要搞清楚,①二维数组的值获取逻辑,②先进行长度计算,再向二维数组中添加元素,最后将temp 再赋值于 que

  4. 在测试用例时,如果数据足够大的情况下,需要扩大数据的遍历,需要扩充为n多个节点

    //完整版代码如下:
    var widthOfBinaryTree = function (root) {
      if (!root) return 0;
      let max = 1n,
        que = [[0n,root]];
      while (que.length) {
        let width = que[que.length - 1][0] - que[0][0] + 1n;
        if (width > max) max = width;
        let temp = [];
        console.log("before"+que.length,temp)
        for (const [i, q] of que) {
          q.left && temp.push([i * 2n, q.left]);
          q.right && temp.push([i * 2n + 1n, q.right]);
        }
        console.log("later"+que.length,temp)
        que = temp;
      }
      return Number(max);
    };
    复制代码

👆 👆 以上就是个人对【二叉树最大深度】的代码解法和方法解读。

理解,解释,改善,改造,创新,加油!!!

更多美文,解你迷惑:二叉树的三种遍历方法 \ 复制带随机指针的链表

文章分类
前端
文章标签