662. Maximum Width of Binary Tree

118 阅读1分钟

Given the root of a binary tree, return the maximum width of the given tree.

The maximum width of a tree is the maximum width among all levels.

The width of one level is defined as the length between the end-nodes (the leftmost and rightmost non-null nodes), where the null nodes between the end-nodes are also counted into the length calculation.

It is guaranteed that the answer will in the range of 32-bit signed integer.

 

Example 1:

Input: root = [1,3,2,5,3,null,9]
Output: 4
Explanation: The maximum width existing in the third level with the length 4 (5,3,null,9).

Example 2:

Input: root = [1,3,null,5,3]
Output: 2
Explanation: The maximum width existing in the third level with the length 2 (5,3).

Example 3:

Input: root = [1,3,2,5]
Output: 2
Explanation: The maximum width existing in the second level with the length 2 (3,2).

 

Constraints:

  • The number of nodes in the tree is in the range [1, 3000].
  • -100 <= Node.val <= 100

答案

func widthOfBinaryTree(root *TreeNode) int {
   res := 0
   if root == nil {
      return res
   }

   type Node struct {
      treeNode *TreeNode
      id       int
   }

   queue := make([]*Node, 0)
   queue = append(queue, &Node{id: 0, treeNode: root})
   max := func(a, b int) int {
      if a >= b {
         return a
      }
      return b
   }

   for len(queue) > 0 {
      left := 0
      right := 0
      size := len(queue)
      for i := 0; i < size; i++ {
         cur := queue[0]
         queue = queue[1:]
         if i == 0 {
            left = cur.id
         }
         if i == size-1 {
            right = cur.id
         }
         if cur.treeNode.Left != nil {
            queue = append(queue, &Node{id: cur.id*2 + 1, treeNode: cur.treeNode.Left})
         }
         if cur.treeNode.Right != nil {
            queue = append(queue, &Node{id: cur.id*2 + 2, treeNode: cur.treeNode.Right})
         }
      }
      res = max(res, right-left+1)
   }

   return res
}