根据中序和后序构造二叉树

来源:Python中,二叉树先序、中序、后序相互求法_DreamReverse的博客-CSDN博客_前序后序求中序python

第一步:输入中序:['c','b','d','a','f','e','g'];后序:['c','d','b','f','g','e','a'],判断后序列表是否为空?为空则结束二叉树的判断,否则从后序中获取根节点的值,并在中序中获取根节点的索引。将根节点后左孩子和右孩子分别存储在二叉树变量bt中。根节点可以直接存储,但是孩子可能是树不能直接存储需要进行判断,如果是树则需要进行树的解码,使用递归的方式进行。根节点1:a;左孩子1的中序是['c', 'b', 'd'],后序是['c', 'd', 'b'];右孩子1的中序是['f','e','g'],后序是['f','g','e']。输出bt1={"data":"a","left":待解析,"right":待解析}

第二步:对左孩子1进行二叉树的解析,根据中序和后序确定左孩子1的根节点和左右孩子。先判断左孩子1的后序是否为空,如果空则停止解析否则继续解析。同样的步骤,获取根节点以及左右孩子。根节点2:b;左孩子2:["c"],右孩子2:["d"]。输出bt2={"data":"b","left":待解析,"right":待解析}

第三步:然后继续进行解析左孩子2,判断后序不为空,其根节点:c,左右孩子为空返回。输出bt3={"data":"c","left":"","right":""}

第四步:解析右孩子2,根节点为d,左右孩子为空返回。输出bt4={"data":"d","left":"","right":""},到此左孩子1已经被解析完成输出bt1={"data":"a","left":{"data":"b","left":"c","right":"d"},"right":待解析}

以同样的步骤解析右孩子,将会得到bt1={"data":"a","left":{"data":"b","left":"c","right":"d"},"right":{"data":"e","left":"f","right":"g"}}

# This is a sample Python script.

# Press Shift+F10 to execute it or replace it with your code.
# Press Double Shift to search everywhere for classes, files, tool windows, actions, and settings.
from typing import List

import os

class BinaryTree(object):
    def __init__(self, data, left = None, right = None):
        self.data = data
        self.left = left
        self.right = right

def binary(last,center):
    if not last:
        return
    date = last[-1];#获取根节点
    index = center.index(date)#获取中序中根节点的索引
    bt = BinaryTree(date)#生成储存变量,根节点,左树和右树
    print("last[:index]",last[:index])
    print("center[:index]", center[:index])
    bt.left = binary(last[:index],center[:index])
    print("last[index:-1]", last[index:-1])
    print("center[index+1:]", center[index+1:])
    bt.right = binary(last[index:-1],center[index+1:])

    return bt

def showBinary(bt):
    if bt == None:
        return
    print(bt.data,end = " ")
    showBinary(bt.left)
    showBinary(bt.right)

def main():
    center = ['c','b','d','a','f','e','g']
    last = ['c','d','b','f','g','e','a']
    bt = binary(last,center)
    showBinary(bt)

if __name__ == '__main__':
    main()


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值