Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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)

AltStyle によって変換されたページ (->オリジナル) /