Skip to content

Commit 2d4276c

Browse files
committed
more trees
1 parent 30b3f32 commit 2d4276c

9 files changed

Lines changed: 211 additions & 3 deletions

File tree

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
# print("maxlen: ", maxLength)
3434
# return maxLength
3535

36-
def lengthLongestPath(input):
36+
def length_longest_path(input):
3737
"""
3838
:type input: str
3939
:rtype: int

string/missing_ranges.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
## find missing ranges between low and high in the given array.
2+
# ex) [3, 5] lo=1 hi=10 => answer: [1->2, 4, 6->10]
3+
4+
def missing_ranges(nums, lo, hi):
5+
res = []
6+
next_num = lo
7+
for num in nums:
8+
if num < next_num:
9+
continue
10+
if num == next_num:
11+
next_num += 1
12+
continue
13+
res.append(get_range(next_num, num-1))
14+
next_num = num + 1
15+
if next_num <= hi:
16+
res.append(get_range(next_num, hi))
17+
return res
18+
19+
def get_range(n1, n2):
20+
if n1 == n2:
21+
return str(n1)
22+
else:
23+
return str(n1) + "->" + str(n2)
24+
25+
nums = [3, 5, 10, 11, 12, 15, 19]
26+
print("original:", nums)
27+
print("missing range: ", missing_ranges(nums,0,20))

tree/BSTIterator.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
2+
class BSTIterator:
3+
def __init__(self, root):
4+
self.stack = []
5+
while root:
6+
self.stack.append(root)
7+
root = root.left
8+
9+
def has_next(self):
10+
return bool(self.stack)
11+
12+
def next(self):
13+
node = stack.pop()
14+
tmp = node
15+
if tmp.right:
16+
tmp = tmp.right
17+
while tmp:
18+
self.stack.append(tmp)
19+
tmp = tmp.left
20+
return node.val
21+
22+
23+
24+

tree/array2bst.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
2+
def array2bst(nums):
3+
if not nums:
4+
return None
5+
mid = len(nums)//2
6+
node = Node(nums[mid])
7+
node.left = array2bst(nums[:mid])
8+
node.right = array2bst(nums[mid+1:])
9+
return node

tree/is_balanced.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
2+
def is_balanced(root):
3+
"""
4+
O(N) solution
5+
"""
6+
return -1 != get_depth(root)
7+
8+
def get_depth(root):
9+
"""
10+
return 0 if unbalanced else depth + 1
11+
"""
12+
if not root:
13+
return 0
14+
left = get_depth(root.left)
15+
right = get_depth(root.right)
16+
if abs(left-right) > 1:
17+
return -1
18+
return 1 + max(left, right)
19+
20+
################################
21+
22+
def is_balanced(root):
23+
"""
24+
O(N^2) solution
25+
"""
26+
left = max_height(root.left)
27+
right = max_height(root.right)
28+
return abs(left-right) <= 1 and is_balanced(root.left) and is_balanced(root.right)
29+
30+
def max_height(root):
31+
if not root:
32+
return 0
33+
return max(max_height(root.left), max_height(root.right)) + 1

tree/is_symmetric.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
2+
def is_symmetric(root):
3+
if not root:
4+
return True
5+
return helper(root.left, root.right)
6+
7+
def helper(p, q):
8+
if not p and not q:
9+
return True
10+
if not p or not q or q.val != p.val:
11+
return False
12+
return helper(p.left, q.right) and helper(p.right, q.left)
13+
14+

tree/max_height.py

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,46 @@
1+
class Node():
2+
def __init__(self, val = 0):
3+
self.val = val
4+
self.left = None
5+
self.right = None
16

2-
def maxDepth(root):
7+
# def max_height(root):
8+
# if not root:
9+
# return 0
10+
# return max(maxDepth(root.left), maxDepth(root.right)) + 1
11+
12+
# iterative
13+
def max_height(root):
314
if not root:
415
return 0
5-
return max(maxDepth(root.left), maxDepth(root.right)) + 1
16+
height = 0
17+
queue = [root]
18+
while queue:
19+
height += 1
20+
level = []
21+
while queue:
22+
node = queue.pop(0)
23+
if node.left:
24+
level.append(node.left)
25+
if node.right:
26+
level.append(node.right)
27+
queue = level
28+
return height
29+
30+
def print_tree(root):
31+
if root:
32+
print(root.val)
33+
print_tree(root.left)
34+
print_tree(root.right)
35+
36+
tree = Node(10)
37+
tree.left = Node(12)
38+
tree.right = Node(15)
39+
tree.left.left = Node(25)
40+
tree.left.left.right = Node(100)
41+
tree.left.right = Node(30)
42+
tree.right.left = Node(36)
43+
44+
height = max_height(tree)
45+
print_tree(tree)
46+
print("height:", height)

tree/max_path_sum.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
2+
maximum = float("-inf")
3+
4+
def max_path_sum(root):
5+
helper(root)
6+
return maximum
7+
8+
def helper(root):
9+
if not root:
10+
return 0
11+
left = helper(root.left)
12+
right = helper(root.right)
13+
maximum = max(maximum, left+right+root.val)
14+
return root.val + max(left, right)

tree/min_height.py

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
class Node():
2+
def __init__(self, val = 0):
3+
self.val = val
4+
self.left = None
5+
self.right = None
6+
7+
def min_height_recursive(root):
8+
if not root:
9+
return 0
10+
return max(maxDepth(root.left), maxDepth(root.right)) + 1
11+
12+
# iterative
13+
def min_height(root):
14+
if not root:
15+
return 0
16+
height = 0
17+
queue = [root]
18+
while queue:
19+
height += 1
20+
level = []
21+
while queue:
22+
node = queue.pop(0)
23+
if node.left:
24+
level.append(node.left)
25+
if node.right:
26+
level.append(node.right)
27+
queue = level
28+
return height
29+
30+
def print_tree(root):
31+
if root:
32+
print(root.val)
33+
print_tree(root.left)
34+
print_tree(root.right)
35+
36+
tree = Node(10)
37+
tree.left = Node(12)
38+
tree.right = Node(15)
39+
tree.left.left = Node(25)
40+
tree.left.left.right = Node(100)
41+
tree.left.right = Node(30)
42+
tree.right.left = Node(36)
43+
44+
height = max_height(tree)
45+
print_tree(tree)
46+
print("height:", height)

0 commit comments

Comments
 (0)