「这是我参与11月更文挑战的第6天,活动详情查看:2021最后一次更文挑战」
题解105: leetcode-二叉树最大宽度
给定一个二叉树,编写一个函数来获取这个树的最大宽度。树的宽度是所有层中的最大宽度。这个二叉树与满二叉树(full binary tree)结构相同,但一些节点为空。
每一层的宽度被定义为两个端点(该层最左和最右的非空节点,两端点间的null节点也计入长度)之间的长度。
题意中要能够理解两点:①树的宽度是所有层中的最大宽度,②每一层的宽度为两个端点之间的长度
接下来选择解题方法,理清思路:
-
在解题之前我们有必要先了解一下,二叉树(满二叉树)的节点分布规律:
- 对
root的所有几点进行编号,root为1,root.left为2 ,root.right为3,依次从左到右进行下去 - 可得出结论:
root.left的index=root的index*2,root.right的index=root的index*2+1
- 对
-
创建
wilhe循环,在while作用域内定义temp临时节点保存空容器,在内部定义可以确保每次循环都是为空数组, -
在这里我们不仅需要进行层数的统计,同时也需要进行每层节点个数的统计,合理的选择使用二位数组进行数据的存储
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 -
在测试用例时,如果数据足够大的情况下,需要扩大数据的遍历,需要扩充为
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); };
👆 👆 以上就是个人对【二叉树最大深度】的代码解法和方法解读。
理解,解释,改善,改造,创新,加油!!!
更多美文,解你迷惑:二叉树的三种遍历方法 \ 复制带随机指针的链表