Maximum Width of Binary Tree 解题心得
https://leetcode.com/problems/maximum-width-of-binary-tree/discuss/
题目复述
输入一个棵二叉树,求其最大宽度
对宽度的定义:即为将整个树当作满二叉树的部分节点的填充,每一层中的满二叉树的节点中如果有节点被输入二叉树的节点填充,则记录这这一层里面最左边到最右边被填充的节点之间的宽度。
其实这个概念不是很好理解,有点抽象,下面我画几张图解释一下
例一:
这里可以看到这个满二叉树只有和输入树重合的部分不为空,而每一层的宽度是一层里最左边填充的节点到最右边填充的节点中间的节点个数(最左边蓝色数字为每层宽度),包括满二叉树的null节点
例二:
例三:
例三很好的给出了一种特殊例子的情况,即为两个非空节点中间有满二叉树的非空节点,第四层里看到到,中间许多满二叉树的空节点需要被计算入内,而需要被计入宽度的节点必须包含在当前层里最左边非空节点到最右边非空节点之间区域的同层满二叉树节点
解题思路
思路可以明显看到就是利用满二叉树的标号性质,即满二叉树逐行标号后,左节点时父节点标号数的两倍,右节点时父节点标号两倍加一
left_node = father_node*2
right_node = father_node*2+1
所以可以通过DFS对每层标号,同时记录每层节点的标号最大差值作为宽度,再记录最大的宽度值为树的最大宽度。
坑:输入测试的节点数可能多达几千层,我从静态数组大小100到1000,再到10000才通过测试。。。。
其实这道题的输入样例可以再难一些,就弄一个只有左子节点的树,一直弄个100多层,这样不可能记录 2100 这么大的数字
最后贴出代码传送门:
https://github.com/zhanzongyuan/leetcode/blob/master/662_Maximum%20Width%20of%20Binary%20Tree.cpp