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
}