3.0 KiB
3.0 KiB
layout, title, last_solved, category, leetcode_url, status
| layout | title | last_solved | category | leetcode_url | status |
|---|---|---|---|---|---|
| page | Max Width of Binary Tree | 2020-07-09 | trees | https://leetcode.com/problems/maximum-width-of-binary-tree | Solved |
Problem
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).
Solution
Tried this but it fails on some test cases.
{% highlight python %}
def widthOfBinaryTree(self, root: TreeNode) -> int:
q = [(root, 0)]
maxWidth = 0
while q:
lvl = []
lvl_size = len(q)
for _ in range(lvl_size):
maxWidth = max(maxWidth, q[-1][1]-q[0][1]+1 )
node, num = q.pop(0)
lvl.append( (node.val, num) )
if node.left:
q.append( (node.left, 2*num) )
if node.right:
q.append( (node.right, 2*num+1))
print(lvl, maxWidth)
return maxWidth
{% endhighlight %}
Your input
[1,3,2,5,3,null,9]
stdout
[(1, 0)] 1
[(3, 0), (2, 1)] 2
[(5, 0), (3, 1), (9, 3)] 4
The one works. Check the difference.
{% highlight python %}
def widthOfBinaryTree(self, root: TreeNode) -> int:
q = [(root, 0)]
maxWidth = 0
while q:
new_lvl = []
lvl_size = len(q)
for _ in range(lvl_size):
maxWidth = max(maxWidth, q[-1][1]-q[0][1]+1 )
node, num = q.pop(0)
# new_lvl.append( (node, num) )
if node.left:
new_lvl.append( (node.left, 2*num) )
if node.right:
new_lvl.append( (node.right, 2*num+1))
q = new_lvl # need to "reset" the nums so the left most is zero again
return maxWidth
{% endhighlight %}