Python二叉树已知先序+中序求后序、已知中序+后序求先序

文章讲述了如何利用递归方法,根据给定的二叉树中序和后序排列,计算其先序排列。通过查找中序中的根节点并调整输出顺序,实现从后序到先序的转换。
摘要由CSDN通过智能技术生成

题目链接:登录—专业IT笔试面试备考平台_牛客网

题目描述

    给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,长度 ≤ 8)。 

输入描述 

2行,均为大写字母组成的字符串,表示一棵二叉树的中序与后序排列。

 输出描述

1行,表示一棵二叉树的先序。

示例 

输入 

BADC
BDCA

输出 

ABCD

思路 

利用递归思路,逐步递归,得到子树的根节点,按照题目要求调整输出位置。在本题中要求先序排列,即父\rightarrow\rightarrow右的顺序进行输出。因此先输出根节点,再递归左子树,最后递归右子树。 其中递归结束标志为子树长度为0,本题已知中序+后序,因此首先根据后序确定根节点为最后一个,再通过遍历在中序中找到根节点,主要目的是将左子树和右子树进行拆分分别进行递归。

代码 

def ToPreOrder(In,Post):
    length = len(Post)
    if length == 0: #递归结束标志
        return

    root = Post[-1] #根据后序找到根节点
    for i in range(length): 
        if root == In[i]: #在中序中找到根节点
            break

    print(root, end = '') #求先序,则先输出根节点再进行递归
    ToPreOrder(In[:i],Post[:i])
    ToPreOrder(In[i + 1:],Post[i:-1])

In = input()
Post = input()
ToPreOrder(In,Post)

回顾总结

      二叉树的一个基本概念。注意一点,已知先序+后序是无法确定出一棵树的,已知中序是必要条件。

 情形一:已知先序+中序,求后序

def ToPostOrder(Pre,In):
    length = len(Pre)
    if length == 0: #递归结束标志
        return
    
    root = Pre[0] #根据先序找到根节点
    for i in range(length):
        if root == In[i]: #在中序中找到根节点
            break

    ToPostOrder(Pre[1:i + 1],In[:i])
    ToPostOrder(Pre[i + 1:],In[i + 1:])
    print(root, end = '')  # 求后序,则先进行递归再输出根节点

Pre = input()
In = input()
ToPostOrder(Pre,In)

  情形二:已知中序+后序,求先序

def ToPreOrder(In,Post):
    length = len(Post)
    if length == 0: #递归结束标志
        return
    root = Post[-1] #根据后序找到根节点
    for i in range(length):
        if root == In[i]: #在中序中找到根节点
            break
    print(root,end = '') #求先序,则先输出根节点再进行递归
    ToPreOrder(In[:i],Post[:i])
    ToPreOrder(In[i + 1:],Post[i:-1])

In = input()
Post = input()
ToPreOrder(In,Post)
  • 17
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小八i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值