[抄题]:
Given a binary tree, write a function to get the maximum width of the given tree. The width of a tree is the maximum width among all levels. The binary tree has the same structure as a full binary tree, but some nodes are null.
The width of one level is defined as the length between the end-nodes (the leftmost and right most non-null nodes in the level, where the null
nodes between the end-nodes are also counted into the length calculation.
Example 1:
Input: 1 / 3 2 / \ \ 5 3 9 Output: 4 Explanation: The maximum width existing in the third level with the length 4 (5,3,null,9).
Example 2:
Input: 1 / 3 / \ 5 3 Output: 2 Explanation: The maximum width existing in the third level with the length 2 (5,3).
Example 3:
Input: 1 / 3 2 / 5 Output: 2 Explanation: The maximum width existing in the second level with the length 2 (3,2).
Example 4:
Input: 1 / 3 2 / \ 5 9 / 6 7 Output: 8 Explanation:The maximum width existing in the fourth level with the length 8 (6,null,null,null,null,null,null,7).
[暴力解法]:
时间分析:
空间分析:
[优化后]:
时间分析:
空间分析:
[奇葩输出条件]:
[奇葩corner case]:
从第三层开始,如果已经满了,就要添加新的index
if (level == list.size()) list.add(index);
[思维问题]:
完全没思路,因此需要一些基础知识
[英文数据结构或算法,为什么不用别的数据结构或算法]:
We know that a binary tree can be represented by an array (assume the root begins from the position with index 1
in the array). If the index of a node is i
, the indices of its two children are 2*i
and 2*i + 1
. The idea is to use two arrays (start[]
and end[]
) to record the the indices of the leftmost node and rightmost node in each level, respectively. For each level of the tree, the width isend[level] - start[level] + 1
. Then, we just need to find the maximum width.
[一句话思路]:
[输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入):
[画图]:
[一刷]:
index的初始值为啥是1?不懂,算了
[二刷]:
[三刷]:
[四刷]:
[五刷]:
[五分钟肉眼debug的结果]:
[总结]:
找参数只是结果,重要的是把所需的变量找出来
还是按照起点、过程、终点来写,index的左右分别为 2 * index 和 2 * index + 1,
[复杂度]:Time complexity: O(n) Space complexity: O(n)
[算法思想:迭代/递归/分治/贪心]:
[关键模板化代码]:
[其他解法]:
[Follow Up]:
[LC给出的题目变变变]:
[代码风格] :
[是否头一次写此类driver funcion的代码] :
[潜台词] :
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { int max = 1; public int widthOfBinaryTree(TreeNode root) { //corner case if (root == null) return 0; //initialization List<Integer> startOfLevel = new ArrayList<Integer>(); //return getWidth(root, 1, 0, startOfLevel); return max; } public void getWidth(TreeNode root, int index, int level, List<Integer> list) { //return null if (root == null) return ; //add the index to list if (list.size() == level) list.add(index); max = Math.max(max, index + 1 - list.get(level)); //divide and conquer in left and right getWidth(root.left, 2 * index, level + 1, list); getWidth(root.right, 2 * index + 1, level + 1, list); } }
原文地址:https://www.cnblogs.com/immiao0319/p/9545768.html