算法3:由二叉树的前序遍历序列和中序遍历序列重建二叉树

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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值