662. Maximum Width of Binary Tree

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).


Note: Answer will in the range of 32-bit signed integer.

class Solution {
    private int max = 1;
        public int widthOfBinaryTree(TreeNode root) {
            if (root == null) return 0;
            List<Integer> startOfLevel = new LinkedList<>();
            helper(root, 0, 1, startOfLevel);
            return max;
        }
        public void helper(TreeNode root, int level, int index, List<Integer> list) {
            if (root == null) return;
            if (level == list.size()){
                 list.add(index);
                 //System.out.println(level+" " +list.toString());
            }
            max = Math.max(max, index + 1 - list.get(level));
            //System.out.println(max);
            helper(root.left, level + 1, index * 2, list);
            helper(root.right, level + 1, index * 2 + 1, list);
        }
}

width of binary tree是指最大的(一层里面最右-最左的index+1)。而二叉树可以描述成数组,节点i的两个孩子的节点分别为2*i和2*i + 1,上面答案的意思是

用一个list把每一层的leftmost的index存起来,具体:如果当前root不为null,而且level == list.size( ),这意味着我们到了新的一层,而且这层的leftmost就是当前节点,我们把它存进list中

然后与当前max作比较并更新,如果是新的max,那一定会是index + 1 - list.get(level),其中list.get(level)是当前的leftmost的index,由于新传入了index,所以可能会出现新max,我们比较就行了

然后继续向下dfs,root.left的index是当前index*2,root.right的index是当前index * 2 + 1。

这类层层的问题似乎都有list.get(heght), 在level order traversal里变成了res.get(height).add(node)

总结:

This question asked us to calculate the max length of a binary tree, the length is defined as in each level, the index of rightmost root - the index of leftmost root + 1

As we know our mission, we would like to store start point(index) of each level, then compare every other nodes in its level to get the maximum.

Note, there's one trick is that we initialize our start point as index 1, then its child is 2*index +1 and 2*index

 

posted @ 2020-07-10 04:16  Schwifty  阅读(154)  评论(0编辑  收藏  举报