import numpy as np
#重建二叉树
#二叉树的前序遍历
preorder = [3,9,20,15,7]
#二叉树的中序遍历
inorder = [9,3,15,20,7]
#定义的临时变量,为了得到二叉树中节点个数
#方便后续定义result(存储重建二叉树节点的一个二维数组)
p = np.array(preorder)
#存储重建二叉树节点的一个二维数组)
result = [[] for i in range(p.shape[0])]
#定义左右子树节点所需变量为列表
left = list
right = list
#定义重建二叉树函数
#第一个参数:前序排列节点
#第二个参数:中序排列节点
#第三个参数:重建树节点所在深度(此处根定义为0层)
def Deal(preorder,inorder,count = 0):
pre = np.array(preorder)
ino = np.array(inorder)
#输出重建以前前序,中序,结果3个变量内容,便于后续分析
print("\n\n")
print(str(count)+"处理前->")
print("Pre:")
print(pre)
print("Ino:")
print(ino)
print("Result:")
print(result)
#递归停止条件,即重建二叉树停止条件为中序或前序节点序列剩下一个结点
if pre.shape[0] == 1:
result[count].append(preorder[0])
return
if ino.shape[0] == 1:
result[count].append(inorder[0])
return
#定义标志位变量,以便于在中序序列中找到前序首元素的时候,跳出双层循环
b = False
#记录跳出循环那一时刻,前序节点的索引号
iFront = 0
for i in range(pre.shape[0]):
for j in range(ino.shape[0]):
#前序序列和中序序列进行节点匹配
if preorder[i] == inorder[j]:
#一旦匹配,将中序序列进行分割,得到左右子树
left = inorder[:j]
right = inorder[j+1:]
iFront = i
b = True
break
if b == True:
break
#输出跳出循环时刻前序节点索引号
print(iFront)
#判断索引号是非首元素,非首元素的情况下,对前序序列进行分片
if iFront > 0:
preorder = preorder[iFront:]
#输出剪短后的前序序列,方便分析
print(preorder)
print('<---]')
#将子树的根节点加入对应层(树的深度)
result[count].append(preorder[0])
#删除前序序列中首元素(其已经作为根节点参加了重建)
del(preorder[0])
#输出处理后的前序,中序,重建结果,左右子树,方便逻辑分析
print('\n\n处理后:')
print("Pre:")
print(preorder)
print("Ino:")
print(inorder)
print("Result:")
print(result)
print("Left:")
print(left)
print("Right:")
print(right)
#将树深度加1,进行新一轮分析重建
count += 1
#对新的左右子树分别进行重建分析
Deal(preorder,left,count)
Deal(preorder,right,count)
#调用函数对前序序列,中序序列进行分析重建,初始树深度设为0
Deal(preorder,inorder,0)
#输出分析结果
print("\n\nFinal Result:")
print(result)