@@ -17,6 +17,8 @@ def __init__(self, value, children: list = None):
1717
1818 if not children :
1919 self .children = []
20+ elif not self .value :
21+ self .children = []
2022 else :
2123 self .children = children
2224
@@ -43,17 +45,16 @@ def preorder_traversal_while(self):
4345 res = []
4446 if not self .root :
4547 return res
48+ stack = [self .root ]
4649
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 ()
5252 if not node .value :
5353 continue
54+ for sub_node in node .children [::- 1 ]:
55+ stack .append (sub_node )
5456 res .append (node .value )
55- for sub_node in node .children :
56- queue .put (sub_node )
57+
5758 return res
5859
5960 def postorder_traversal_while (self ):
@@ -115,11 +116,118 @@ def _inner(root):
115116
116117 return _inner (self .root )
117118
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+
118219
119220if __name__ == '__main__' :
221+ node1 , node2 = TreeNode (6 ), TreeNode (8 )
120222 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 ])]))
122224 print (t .preorder_traversal_while ())
123225 print (t .postorder_traversal_while ())
124226 print (t .preorder_traversal_recursion ())
125227 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