Skip to content

Commit 9c63966

Browse files
authored
Create balance-a-binary-search-tree.py
1 parent 8b8b7d1 commit 9c63966

File tree

1 file changed

+84
-0
lines changed

1 file changed

+84
-0
lines changed
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
# Time: O(n)
2+
# Space: O(h)
3+
4+
# Definition for a binary tree node.
5+
class TreeNode(object):
6+
def __init__(self, x):
7+
self.val = x
8+
self.left = None
9+
self.right = None
10+
11+
12+
class Solution(object):
13+
def balanceBST(self, root):
14+
"""
15+
:type root: TreeNode
16+
:rtype: TreeNode
17+
"""
18+
def inorderTraversal(root):
19+
result, stk = [], [(root, False)]
20+
while stk:
21+
node, is_visited = stk.pop()
22+
if node is None:
23+
continue
24+
if is_visited:
25+
result.append(node.val)
26+
else:
27+
stk.append((node.right, False))
28+
stk.append((node, True))
29+
stk.append((node.left, False))
30+
return result
31+
32+
def orderedArrayToBst(arr):
33+
ROOT, LEFT, RIGHT = range(3)
34+
result = [None]
35+
stk = [(0, len(arr), ROOT, result)]
36+
while stk:
37+
i, j, update, ret = stk.pop()
38+
if i >= j:
39+
continue
40+
mid = i + (j-i)//2
41+
node = TreeNode(arr[mid])
42+
if update == ROOT:
43+
ret[0] = node
44+
elif update == LEFT:
45+
ret[0].left = node
46+
else:
47+
ret[0].right = node
48+
stk.append((mid+1, j, RIGHT, [node]))
49+
stk.append((i, mid, LEFT, [node]))
50+
return result[0]
51+
52+
return orderedArrayToBst(inorderTraversal(root))
53+
54+
55+
# Time: O(n)
56+
# Space: O(h)
57+
class Solution2(object):
58+
def balanceBST(self, root):
59+
"""
60+
:type root: TreeNode
61+
:rtype: TreeNode
62+
"""
63+
def inorderTraversal(root):
64+
def inorderTraversalHelper(node, arr):
65+
if not node:
66+
return
67+
inorderTraversalHelper(node.left, arr)
68+
arr.append(node.val)
69+
inorderTraversalHelper(node.right, arr)
70+
71+
arr = []
72+
inorderTraversalHelper(root, vals)
73+
return arr
74+
75+
def orderedArrayToBst(arr, i, j):
76+
if i >= j:
77+
return None
78+
mid = i + (j-i)//2
79+
return TreeNode(arr[mid],
80+
orderedArrayToBst(arr, i, mid),
81+
orderedArrayToBst(arr, mid+1, j))
82+
83+
arr = inorderTraversal(root)
84+
return orderedArrayToBst(arr, 0, len(arr))

0 commit comments

Comments
 (0)