@@ -12,191 +12,162 @@ def __init__(self, data):
12
12
self .right = None
13
13
self .data = data
14
14
15
- class BinaryTree :
16
- """
17
- Binary tree: methods to manipulate a binary tree
18
- """
19
- def __init__ (self ):
20
- """
21
- Binary tree constructor
15
+ def insert (self , data ):
22
16
"""
23
- self . root = None
17
+ Insert new node with data
24
18
25
- def get_root (self ):
26
- return self .root
19
+ @param data node data object to insert
20
+ """
21
+ elif data < self .data :
22
+ if self .left == None :
23
+ self .left = Node (data )
24
+ else :
25
+ self .left .insert (data )
26
+ else :
27
+ if self .right == None :
28
+ self .right = Node (data )
29
+ else :
30
+ self .right .insert (data )
27
31
28
- def insert (self , data ):
29
- node = bt_insert (self .root , data )
30
- if self .root == None :
31
- self .root = node
32
+ def lookup (self , data , parent = None ):
33
+ """
34
+ Lookup node containing data
32
35
33
- def lookup (self , data ):
34
- return bt_lookup (self .root , data )
36
+ @param data node data object to look up
37
+ @param parent node's parent
38
+ @returns node and node's parent if found or None, None
39
+ """
40
+ if data < self .data :
41
+ if self .left == None :
42
+ return None , None
43
+ return self .left .lookup (data , self )
44
+ elif data > self .data :
45
+ if self .right == None :
46
+ return None , None
47
+ return self .right .lookup (data , self )
48
+ else :
49
+ return self , parent
35
50
36
51
def delete (self , data ):
37
- return bt_delete (self .root , data )
52
+ """
53
+ Delete node containing data
38
54
39
- def compare_trees (self , root ):
40
- return bt_compare_trees (self .root , root )
55
+ @param data node's content to delete
56
+ """
57
+ # get node containing data
58
+ node , parent = self .lookup (data )
59
+ if node != None :
60
+ children_count = self .children_count (node )
61
+ if children_count == 0 :
62
+ # if node has no children, just remove it
63
+ if self .which_child (parent , node ) == 'left' :
64
+ parent .left = None
65
+ else :
66
+ parent .right = None
67
+ elif children_count == 1 :
68
+ # if node has 1 child
69
+ # replace node by its child
70
+ if node .left :
71
+ node .data = node .left .data
72
+ node .left = None
73
+ else :
74
+ node .data = node .right .data
75
+ node .right = None
76
+ else :
77
+ # if node has 2 children
78
+ # find its successor
79
+ parent = node
80
+ successor = node .right
81
+ while successor .left :
82
+ parent = successor
83
+ successor = successor .left
84
+ # replace node data by its successor data
85
+ node .data = successor .data
86
+ # fix successor's parent node child
87
+ if parent .left == successor :
88
+ parent .left = successor .right
89
+ else :
90
+ parent .right = successor .right
91
+
92
+ def compare_trees (self , node ):
93
+ """
94
+ Compare 2 trees
41
95
96
+ @param node tree to compare
97
+ @returns True if the tree passed is identical to this tree
98
+ """
99
+ if node == None :
100
+ return False
101
+ if self .data != node .data :
102
+ return False
103
+ res = True
104
+ if self .left == None :
105
+ if node .left :
106
+ return False
107
+ else :
108
+ res = self .left .compare_trees (node .left )
109
+ if self .right == None :
110
+ if node .right :
111
+ return False
112
+ else :
113
+ res = self .right .compare_trees (node .right )
114
+ return res
115
+
42
116
def print_tree (self ):
43
- bt_print_tree (self .root )
117
+ """
118
+ Print tree content inorder
119
+ """
120
+ if self .left :
121
+ self .left .print_tree ()
122
+ print self .data ,
123
+ if self .right :
124
+ self .right .print_tree ()
44
125
45
126
def tree_data (self ):
46
- return bt_tree_data (self .root )
47
-
48
- def bt_insert (root , data ):
49
- """
50
- Insert new node with data
51
-
52
- @param root tree root
53
- @param data node data object
54
- @returns inserted node
55
- """
56
- if root == None :
57
- root = Node (data )
58
- else :
59
- if data <= root .data :
60
- root .left = bt_insert (root .left , data )
61
- else :
62
- root .right = bt_insert (root .right , data )
63
- return root
64
-
65
- def bt_lookup (root , data , parent = None ):
66
- """
67
- Lookup node containing data
68
-
69
- @param root tree root
70
- @param data node data object
71
- @returns node and node's parent if found or None, None
72
- """
73
- if root == None :
74
- return None , None
75
- if data < root .data :
76
- return bt_lookup (root .left , data , root )
77
- elif data > root .data :
78
- return bt_lookup (root .right , data , root )
79
- else :
80
- return root , parent
81
-
82
- def bt_compare_trees (root1 , root2 ):
83
- """
84
- Compare 2 trees
85
-
86
- @param root1 tree 1 root node
87
- @param root2 tree 2 root node
88
- @returns True if the 2 trees are identical or False
89
- """
90
- if root1 == None and root2 == None :
91
- return True
92
- elif (root1 == None and root2 != None ) or (root1 != None and root2 == None ):
93
- return False
94
- else :
95
- return (root1 .data == root2 .data ) \
96
- and bt_compare_trees (root1 .left , root2 .left ) \
97
- and bt_compare_trees (root1 .right , root2 .right )
98
-
99
- def bt_print_tree (root ):
100
- """
101
- Print tree content inorder
102
-
103
- @param root tree root node
104
- """
105
- if root :
106
- bt_print_tree (root .left )
107
- print root .data ,
108
- bt_print_tree (root .right )
109
-
110
- def bt_tree_data (root ):
111
- """
112
- Generator to get the tree nodes data
113
-
114
- @param node tree root node
115
- """
116
- # we use a stack to traverse the tree in a non-recursive way
117
- stack = []
118
- node = root
119
- while stack or node :
120
- if node :
121
- stack .append (node )
122
- node = node .left
123
- else : # we are returning so we pop the node and we yield it
124
- node = stack .pop ()
125
- yield node .data
126
- node = node .right
127
-
128
- def bt_delete (root , data ):
129
- """
130
- Delete node containing data
127
+ """
128
+ Generator to get the tree nodes data
129
+ """
130
+ # we use a stack to traverse the tree in a non-recursive way
131
+ stack = []
132
+ node = self
133
+ while stack or node :
134
+ if node :
135
+ stack .append (node )
136
+ node = node .left
137
+ else : # we are returning so we pop the node and we yield it
138
+ node = stack .pop ()
139
+ yield node .data
140
+ node = node .right
141
+
142
+ def which_child (self , parent , child ):
143
+ """
144
+ Test if child is parent's left child or parent's right child
131
145
132
- @param root tree root node
133
- @param data node's content to delete
134
- """
135
- # get node containing data
136
- node , parent = bt_lookup (root , data )
137
- if node != None :
138
- children_count = bt_children_count (node )
139
- if children_count == 0 :
140
- # if node has no children, just remove it
141
- if bt_which_child (parent , node ) == 'left' :
142
- parent .left = None
143
- else :
144
- parent .right = None
145
- elif children_count == 1 :
146
- # if node has 1 child
147
- # replace node by its child
148
- if node .left :
149
- node .data = node .left .data
150
- node .left = None
151
- else :
152
- node .data = node .right .data
153
- node .right = None
146
+ @param parent parent node
147
+ @param child parent's child node
148
+ """
149
+ if parent == None :
150
+ return None
151
+ if parent .left == child :
152
+ return 'left'
154
153
else :
155
- # if node has 2 children
156
- # find its successor
157
- parent = node
158
- successor = node .right
159
- while successor .left :
160
- parent = successor
161
- successor = successor .left
162
- node .data = successor .data
163
- # if the successor has a child, replace it with its child
164
- # it can only be a right child at this point
165
- if successor .right :
166
- successor .data = successor .right .data
167
- successor .right = None
168
- else :
169
- parent .left = None
154
+ return 'right'
170
155
171
- def bt_which_child (parent , child ):
172
- """
173
- Test if child is parent's left child or parent's right child
174
-
175
- @param parent parent node
176
- @param child parent's child node
177
- """
178
- if parent == None :
179
- return None
180
- if parent .left == child :
181
- return 'left'
182
- else :
183
- return 'right'
184
-
185
- def bt_children_count (node ):
186
- """
187
- Return the number of children
156
+ def children_count (self , node ):
157
+ """
158
+ Return the number of children
188
159
189
- @param node node to get nb of children
190
- @returns number of children: 0, 1, 2
191
- """
192
- if node == None :
193
- return None
194
- cnt = 0
195
- if node .left :
196
- cnt += 1
197
- if node .right :
198
- cnt += 1
199
- return cnt
160
+ @param node node to get nb of children
161
+ @returns number of children: 0, 1, 2
162
+ """
163
+ if node == None :
164
+ return None
165
+ cnt = 0
166
+ if node .left :
167
+ cnt += 1
168
+ if node .right :
169
+ cnt += 1
170
+ return cnt
200
171
201
172
202
173
0 commit comments