Skip to content

Commit faa442c

Browse files
author
Mari Wahl
committed
last fixes: tree common ancestor
1 parent cc8f109 commit faa442c

File tree

4 files changed

+108
-52
lines changed

4 files changed

+108
-52
lines changed

src/trees/binary_search_tree.py

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,10 +54,22 @@ def _printPreorder(self):
5454
print self.item
5555

5656
if self.left:
57-
return self.left._printPreorder()
57+
self.left._printPreorder()
5858

5959
if self.right:
60-
return self.right._printPreorder()
60+
self.right._printPreorder()
61+
62+
# Another possibility: use an array (a little bit more expensive):
63+
def _preorder_array(self):
64+
nodes = []
65+
if self.item:
66+
nodes.append(self.item)
67+
if self.left:
68+
nodes.extend(self.left._preorder_array())
69+
if self.right:
70+
nodes.extend(self.right._preorder_array())
71+
return nodes
72+
6173

6274

6375

@@ -80,6 +92,11 @@ def search(self, value):
8092
if self.root:
8193
return self.root._search(value)
8294

95+
def preorder_array(self):
96+
if self.root:
97+
return self.root._preorder_array()
98+
else:
99+
return 'Tree is empty.'
83100

84101

85102
if __name__ == '__main__':

src/trees/binary_tree.py

Lines changed: 12 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,14 @@ def _isLeaf(self):
4747
return not self.right and not self.left
4848

4949

50+
def _preorder(self):
51+
print self.item
52+
if self.left:
53+
self.left._preorder()
54+
if self.right:
55+
self.right._preorder()
56+
57+
5058

5159
class BT(object):
5260

@@ -61,40 +69,14 @@ def add(self, value):
6169
self.root._add(value)
6270

6371

64-
def printPreorder(self):
65-
current = self.root
66-
nodes, stack = [], []
67-
while stack or current:
68-
if current:
69-
nodes.append(current.item) # this is what change
70-
stack.append(current)
71-
current = current.left
72-
else:
73-
current = stack.pop()
74-
current = current.right
75-
print nodes
76-
77-
78-
def printInorder(self):
79-
current = self.root
80-
nodes, stack = [], []
81-
while stack or current:
82-
83-
if current:
84-
stack.append(current)
85-
current = current.left
86-
else:
87-
current = stack.pop()
88-
nodes.append(current.item) # this is what change
89-
current = current.right
90-
print nodes
91-
92-
9372
def search(self, value):
9473
if self.root:
9574
return self.root._search(value)
9675

9776

77+
def preorder(self):
78+
if self.root:
79+
return self.root._preorder()
9880

9981

10082
if __name__ == '__main__':
@@ -111,7 +93,4 @@ def search(self, value):
11193

11294
print
11395
print "Printing preorder..."
114-
bt.printPreorder()
115-
116-
print "Printing Inorder..."
117-
bt.printInorder()
96+
bt.preorder()

src/trees/binary_tree_generators.py

Lines changed: 47 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,22 @@ def add(self, value):
1414
if not self.value:
1515
self.value = new_node
1616
elif not self.left:
17-
self.left= new_node
17+
self.left = new_node
1818
elif not self. right:
1919
self.right = new_node
2020
else:
2121
self.left = self.left.add(value)
22-
2322
return self # without this, it doesn't add!
2423

24+
def search(self, item):
25+
if self.value == item:
26+
return True
27+
found = False
28+
if (self.left and self.left.search(item)) or \
29+
(self.right and self.right.search(item)):
30+
found = True
31+
return found
32+
2533
def preorder(self):
2634
yield self.value
2735
if self.left:
@@ -40,7 +48,6 @@ def postorder(self):
4048
for node in self.right.postorder():
4149
yield node
4250

43-
4451
def inorder(self):
4552
yield self.value
4653
if self.left:
@@ -50,6 +57,14 @@ def inorder(self):
5057
for node in self.right.inorder():
5158
yield node
5259

60+
# this is the most basic way to write this function
61+
def preorder_simple(self):
62+
print self.value
63+
if self.left:
64+
self.left.preorder_simple()
65+
if self.right:
66+
self.right.preorder_simple()
67+
5368

5469
# Another possibility: use an array (a little bit more expensive):
5570
def preorder_array(self):
@@ -74,6 +89,12 @@ def add(self, value):
7489
else:
7590
self.root.add(value)
7691

92+
def search(self, item):
93+
if self.root:
94+
return self.root.search(item)
95+
else:
96+
return 'Tree is empty.'
97+
7798
def preorder(self):
7899
if self.root:
79100
return self.root.preorder()
@@ -98,6 +119,11 @@ def preorder_array(self):
98119
else:
99120
return 'Tree is empty.'
100121

122+
def preorder_simple(self):
123+
if self.root:
124+
return self.root.preorder_simple()
125+
else:
126+
return 'Tree is empty.'
101127

102128

103129
if __name__ == '__main__':
@@ -106,21 +132,38 @@ def preorder_array(self):
106132
for i in range(1, 11):
107133
tree.add(i)
108134

135+
print 'Searching for node 4'
136+
print tree.search(4)
137+
138+
print 'Searching for node 1'
139+
print tree.search(1)
140+
141+
print 'Searching for node 12'
142+
print tree.search(12)
143+
144+
print 'Pre-order generator...'
109145
getree = tree.preorder()
110146
for i in range(10):
111147
print next(getree)
112-
113148
print
149+
print 'Pre-order array...'
114150

115151
print tree.preorder_array()
116152

117153
print
154+
print 'Pre-order simple...'
155+
156+
tree.preorder_simple()
157+
158+
print
159+
print 'Inorder...'
118160

119161
getree = tree.inorder()
120162
for i in range(10):
121163
print next(getree)
122164

123165
print
166+
print 'Postorder...'
124167

125168
getree = tree.postorder()
126169
for i in range(10):

src/trees/check_ancestor.py

Lines changed: 30 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,37 +4,54 @@
44

55

66
from binary_search_tree import BST, Node
7-
from transversal import inorder
8-
9-
def find_ancestor(path, low_value, high_value):
107

8+
def find_ancestor(path, low_item, high_item):
119
while path:
12-
current_value = path[0]
10+
current_item = path[0]
1311

14-
if current_value < low_value:
12+
if current_item < low_item:
1513
try:
1614
path = path[2:]
1715
except:
18-
return current_value
16+
return current_item
1917

20-
elif current_value > high_value:
18+
elif current_item > high_item:
2119
try:
2220
path = path[1:]
2321
except:
24-
return current_value
22+
return current_item
2523

26-
elif low_value <= current_value <= high_value:
27-
return current_value
24+
elif low_item <= current_item <= high_item:
25+
return current_item
2826

2927

30-
if __name__ == '__main__':
28+
def find_ancestor2(tree, n1, n2):
29+
if not tree:
30+
return False
31+
32+
if n1 <= tree.item and n2 >= tree.item or (not tree.left and not tree.right) :
33+
return tree.item
34+
35+
if tree.left and (n1 < tree.item and n2 < tree.item):
36+
return find_ancestor(tree.left, n1, n2) or tree.item
37+
38+
if tree.right and (n1 > tree.item and n2 > tree.item):
39+
return find_ancestor(tree.right, n1, n2) or tree.item
3140

3241

42+
43+
if __name__ == '__main__':
3344
bst = BST()
3445
l = [10, 5, 6, 3, 8, 2, 1, 11, 9, 4]
3546
for i in l:
3647
bst.add(i)
37-
nodes = inorder(bst.root)
48+
nodes = bst.preorder_array()
49+
3850
print 'Original: ', l
39-
print 'Inorder: ', nodes
51+
print 'Preorder: ', nodes
52+
53+
print 'Method 1: '
4054
print 'Ancestor for 3, 11:', find_ancestor(nodes, 3, 11)
55+
56+
print 'Method 2: '
57+
print 'Ancestor for 3, 11: ', find_ancestor2(bst.root, 3, 11)

0 commit comments

Comments
 (0)