@@ -17,6 +17,8 @@ def __init__(self, value, children: list = None):
17
17
18
18
if not children :
19
19
self .children = []
20
+ elif not self .value :
21
+ self .children = []
20
22
else :
21
23
self .children = children
22
24
@@ -43,17 +45,16 @@ def preorder_traversal_while(self):
43
45
res = []
44
46
if not self .root :
45
47
return res
48
+ stack = [self .root ]
46
49
47
- queue = Queue ()
48
- queue .put (self .root )
49
-
50
- while queue .qsize ():
51
- node = queue .get ()
50
+ while len (stack ):
51
+ node = stack .pop ()
52
52
if not node .value :
53
53
continue
54
+ for sub_node in node .children [::- 1 ]:
55
+ stack .append (sub_node )
54
56
res .append (node .value )
55
- for sub_node in node .children :
56
- queue .put (sub_node )
57
+
57
58
return res
58
59
59
60
def postorder_traversal_while (self ):
@@ -115,11 +116,118 @@ def _inner(root):
115
116
116
117
return _inner (self .root )
117
118
119
+ def layer_while (self ):
120
+ """
121
+ 树的层序遍历
122
+ :return: list of tree node value
123
+ """
124
+ res = []
125
+ if not self .root :
126
+ return res
127
+
128
+ queue = Queue ()
129
+ queue .put (self .root )
130
+
131
+ while queue .qsize ():
132
+ node = queue .get ()
133
+ if not node .value :
134
+ continue
135
+ res .append (node .value )
136
+ for sub_node in node .children :
137
+ queue .put (sub_node )
138
+ return res
139
+
140
+ def layer_recursion (self ):
141
+ # todo
142
+ pass
143
+
144
+ def depth_recursion (self ):
145
+
146
+ def _inner (root , depth = 1 ):
147
+ if not root .children :
148
+ return depth
149
+ return max ([_inner (sub_node , depth + 1 ) for sub_node in root .children ])
150
+
151
+ return _inner (self .root )
152
+
153
+ def node_count (self ):
154
+ def _inner (root ):
155
+ if not root .children :
156
+ return 1
157
+ return 1 + sum ([_inner (sub_node ) for sub_node in root .children ])
158
+ return _inner (self .root )
159
+
160
+ def leaf_count (self ):
161
+ def _inner (root ):
162
+ if not root .children :
163
+ return 1
164
+ return sum ([_inner (sub_node ) for sub_node in root .children ])
165
+ return _inner (self .root )
166
+
167
+ def lowest_ancestor_node (self , node1 , node2 ):
168
+ stack = [self .root ]
169
+ stack1 = None
170
+ stack2 = None
171
+
172
+ while len (stack ) and not (stack1 and stack2 ):
173
+ node = stack .pop ()
174
+
175
+ if node is node1 :
176
+ stack1 = stack [:]
177
+ if node is node2 :
178
+ stack2 = stack [:]
179
+ if not node .value :
180
+ continue
181
+ for sub_node in node .children :
182
+ stack .append (sub_node )
183
+
184
+ res = self .root
185
+ for i in range (len (stack1 )):
186
+ if stack1 [i ] == stack2 [i ]:
187
+ res = stack1 [i ]
188
+ else :
189
+ return res .value
190
+
191
+ return res .value
192
+
193
+ def two_node_distence (self , node1 , node2 ):
194
+ stack = [self .root ]
195
+ stack1 = None
196
+ stack2 = None
197
+
198
+ while len (stack ) and not (stack1 and stack2 ):
199
+ node = stack .pop ()
200
+
201
+ if node is node1 :
202
+ stack1 = stack [:]
203
+ if node is node2 :
204
+ stack2 = stack [:]
205
+ if not node .value :
206
+ continue
207
+ for sub_node in node .children :
208
+ stack .append (sub_node )
209
+
210
+ res = self .root
211
+ for i in range (len (stack1 )):
212
+ if stack1 [i ] == stack2 [i ]:
213
+ res = stack1 [i ]
214
+ else :
215
+ return len (stack1 ) + len (stack2 ) - 2 * i
216
+
217
+ return len (stack1 ) + len (stack2 ) - 2 * i
218
+
118
219
119
220
if __name__ == '__main__' :
221
+ node1 , node2 = TreeNode (6 ), TreeNode (8 )
120
222
t = Tree (
121
- TreeNode (1 , [TreeNode (2 , [TreeNode (4 ), TreeNode (5 ), TreeNode ( 6 ) ]), TreeNode (3 , [TreeNode (7 ), TreeNode ( 8 ) ])]))
223
+ TreeNode (1 , [TreeNode (2 , [TreeNode (4 ), TreeNode (5 ), node1 ]), TreeNode (3 , [TreeNode (7 ), node2 ])]))
122
224
print (t .preorder_traversal_while ())
123
225
print (t .postorder_traversal_while ())
124
226
print (t .preorder_traversal_recursion ())
125
227
print (t .postorder_traversal_recursion ())
228
+ print (t .layer_while ())
229
+ print (t .depth_recursion ())
230
+ print (t .node_count ())
231
+ print (t .leaf_count ())
232
+ print (t .lowest_ancestor_node (node1 , node2 ))
233
+ print (t .two_node_distence (node1 , node2 ))
0 commit comments