# CY3761 | 2021-12-22 16:51
"""
思考题
如何通过一棵无重复节点的树的
先序遍历(先) 中序遍历(中)
先: 0->1->3->7->8->4->9->2->5->6
中: 7->3->8->1->9->4->0->5->2->6
去构造这棵树的结构?
0(根)
先: 1->3->7->8->4->9 | 2->5->6
中: 7->3->8->1->9->4 | 5->2->6
12(0) (先序遍历中第一位为根)
先1:3->7->8 | 4->9
先2:5->6
中1:7->3->8 | 9->4
中2:5 | 6
3(1)
78(3)
0(根)
12(0)
34(1) 56(2)
78(3)
9(4)
"""
# 节点类
class Node:
def __init__(self, item):
self.item = item # 节点值
self.lPoi = None # 左指针域
self.rPoi = None # 右指针域
class Tree:
def __init__(self):
self.root = None # 根节点
def add(self, item):
"""
添加节点 往树添加一个节点 并保证添加后的树是一个完全二叉树
从上往下 从左往右 遍历树 找到树的空位
把节点添加进去
:param item: 添加节点的值
:return:
"""
# print('-' * 80)
oNode = Node(item) # 创建节点
if not self.root: # 判断 root 是否为空
# print(item)
self.root = oNode
return
items = [self.root] # 每一层的节点进行存储
while True:
aItem = items.pop(0) # 弹出第一个
# print(item, getId(aItem), aItem.item, not aItem.lPoi, not aItem.rPoi)
if not aItem.lPoi: # 先找左边是否为空
aItem.lPoi = oNode
return
elif not aItem.rPoi: # 再找右边是否为空
aItem.rPoi = oNode
return
# 如果左右都非空 则 加入数据
items.extend((aItem.lPoi, aItem.rPoi)) # pop 从后面弹出
def show(self):
if not self.root: # 判断 root 是否为空
return
items = [self.root] # 每一层的节点进行存储
while items:
for _ in range(len(items)):
node = items.pop(0)
print(node.item, end='\t')
if node.lPoi: # 左边是否为空
items.append(node.lPoi)
if node.rPoi: # 右边是否为空
items.append(node.rPoi)
print()
def buildTree(before, middle, rst='根'):
"""
根据先序和中序遍历 构建数
:param before: 先序遍历
:param middle: 中序遍历
:return:
"""
if not before or not middle:
return
r = before[0] # 从先序遍历获取根
mr = middle.index(r) # 获取根在中序遍历位置
n = Node(r) # 创建根节点
n.lPoi = buildTree(before[1:mr+1], middle[:mr])
n.rPoi = buildTree(before[mr+1:], middle[mr+1:])
return n
if __name__ == '__main__':
oT = Tree()
oT.root = buildTree(
[0, 1, 3, 7, 8, 4, 9, 2, 5, 6],
[7, 3, 8, 1, 9, 4, 0, 5, 2, 6]
)
oT.show()
pass
数据结构和算法 | 根据前序遍历与中序遍历确定树
最新推荐文章于 2024-07-14 01:31:01 发布