154 lines
3.0 KiB
Markdown
154 lines
3.0 KiB
Markdown
|
|
---
|
||
|
|
layout: page
|
||
|
|
title: Max Width of Binary Tree
|
||
|
|
last_solved: 2020-07-09
|
||
|
|
category: trees
|
||
|
|
leetcode_url: https://leetcode.com/problems/maximum-width-of-binary-tree
|
||
|
|
status: 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 %}
|
||
|
|
|
||
|
|
![image1]()
|