Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit f4f1f7a

Browse files
committed
tree over
1 parent 5c8f0d1 commit f4f1f7a

File tree

1 file changed

+116
-8
lines changed

1 file changed

+116
-8
lines changed

data_structure/tree/tree.py

Lines changed: 116 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -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

119220
if __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

Comments
 (0)