使用了队列和栈两种数据结构来完成不同的遍历方式:
from collections import deque
# 定义节点类
class Node:
def __init__(self, val):
self.val = val
self.left = None
self.right = None
# 先序遍历
def preorder(root):
if root is None:
return []
stack, res = [root], []
while stack:
node = stack.pop()
res.append(node.val)
if node.right is not None:
stack.append(node.right)
if node.left is not None:
stack.append(node.left)
return res
# 后序遍历
def postorder(root):
if root is None:
return []
stack1, stack2, res = [root], [], []
while stack1:
node = stack1.pop()
stack2.append(node)
if node.left is not None:
stack1.append(node.left)
if node.right is not None:
stack1.append(node.right)
while stack2:
node = stack2.pop()
res.append(node.val)
return res
# 层次遍历
def levelorder(root):
if root is None:
return []
queue, res = deque([root]), []
while queue:
node = queue.popleft()
res.append(node.val)
if node.left is not None:
queue.append(node.left)
if node.right is not None:
queue.append(node.right)
return res
# 叶子节点遍历
def leaforder(root):
if root is None:
return []
stack, res = [root], []
while stack:
node = stack.pop()
if node.right is not None:
stack.append(node.right)
if node.left is not None:
stack.append(node.left)
if node.left is None and node.right is None:
res.append(node.val)
return res
# 主函数
if __name__ == '__main__':
n = int(input())
nodes = [Node(i) for i in range(n)]
for _ in range(n - 1):
x, y = map(int, input().split())
if nodes[x - 1].left is None:
nodes[x - 1].left = nodes[y - 1]
else:
nodes[x - 1].right = nodes[y - 1]
print(' '.join(map(str, preorder(nodes[0]))))
print(' '.join(map(str, postorder(nodes[0]))))
print(' '.join(map(str, levelorder(nodes[0]))))
print(' '.join(map(str, leaforder(nodes[0]))))
首先读入节点数n和边的关系,然后创建了一个长度为n的节点数组。接着,对于每一条边(x,y),如果x节点还没有左儿子,则把y节点作为x的左儿子,否则作为右儿子。最后调用4个不同的遍历函数,分别输出先序、后序、层次、叶子节点遍历序列