Python模拟二叉树
·
from collections import deque
# 树节点类
class Node:
def __init__(self, value):
self.value = value
self.lchild = None
self.rchild = None
# 二叉树类
class BinaryTree:
# 初始化属性
def __init__(self, node = None):
self.root = node
def is_empty(self):
return self.root is None
# 添加节点
def add(self, value):
# 创建新节点
new_node = Node(value)
# 判空
if self.is_empty():
self.root = new_node
return
# 非空
queue = deque([self.root])
while queue:
cur = queue.popleft()
# 左子树
if cur.lchild is None:
cur.lchild = new_node
return
queue.append(cur.lchild)
# 右子树
if cur.rchild is None:
cur.rchild = new_node
return
queue.append(cur.rchild)
# 广度优先遍历
def breadth_traversal(self):
# 判空
if self.is_empty():
return []
# 非空
res = []
queue = deque([self.root])
while queue:
cur = queue.popleft()
res.append(cur.value)
# 左子树
if cur.lchild:
queue.append(cur.lchild)
# 右子树
if cur.rchild:
queue.append(cur.rchild)
return res
# 深度优先遍历
# 前序 根左右
def pre_order_traversal(self):
res = []
def dfs(node):
if node:
res.append(node.value)
dfs(node.lchild)
dfs(node.rchild)
dfs(self.root)
return res
# 中序 左根右
def in_order_traversal(self):
res = []
def dfs(node):
if node:
dfs(node.lchild)
res.append(node.value)
dfs(node.rchild)
dfs(self.root)
return res
# 后序 左右根
def post_order_traversal(self):
res = []
def dfs(node):
if node:
dfs(node.lchild)
dfs(node.rchild)
res.append(node.value)
dfs(self.root)
return res
if __name__ == "__main__":
# 测试广度优先
my_binary_tree = BinaryTree()
test_binary = [chr(c) for c in range(ord('A'), ord('J') + 1)]
for c in test_binary:
my_binary_tree.add(c)
print('->'.join(map(str, my_binary_tree.breadth_traversal())))
# 测试深度优先
my_binary_tree2 = BinaryTree()
test_binary2 = [i for i in range(0, 10)]
for i in test_binary2:
my_binary_tree2.add(i)
root_l_r = my_binary_tree2.pre_order_traversal()
l_root_r = my_binary_tree2.in_order_traversal()
r_l_root = my_binary_tree2.post_order_traversal()
print('->'.join(map(str, root_l_r)))
print('->'.join(map(str, l_root_r)))
print('->'.join(map(str, r_l_root)))
更多推荐
所有评论(0)