题目描述
给定一个二叉树,编写一个函数来获取这个树的最大宽度。树的宽度是所有层中的最大宽度。这个二叉树与满二叉树(full binary tree)结构相同,但一些节点为空。
每一层的宽度被定义为两个端点(该层最左和最右的非空节点,两端点间的null节点也计入长度)之间的长度。
示例
示例 1:
输入:
1 | 1 |
输出: 4
解释: 最大值出现在树的第 3 层,宽度为 4 (5,3,null,9)。
示例 2:
输入:
1 | 1 |
输出: 2
解释: 最大值出现在树的第 3 层,宽度为 2 (5,3)。
注意: 答案在32位有符号整数的表示范围内。
解题思路:
1 | 1(0) |
由上图可知左孩子是它的父节点的编号的2倍,即2i,右孩子是它的父节点的2i+1,那么每一层的宽度就为:
第一层:0 - 0 + 1 = 1宽度为1
第二层:1 - 0 + 1 = 2宽度为2
第三层:3 - 0 + 1 = 4宽度为4
…
即每一层的宽度就为该层最右边节点的编号 - 最左边节点的编号 + 1
但是这样就会有个小问题:即编号逐渐增大,超出范围怎么办:如果每一层都可以减去一个固定的值那么结果即不会变,而且数也不会超出这个范围,而且这个数不能为负数。
所以我们可以取该节点的父节点那一层中最小的数。(该数肯定不为负数,且该数肯定比当前层的数要小于或者等于)
1 | /** |