二叉树前中后遍历互求

题目
POJ - 2255 前中求后
nyoj -756 后中求前

先说一下二叉树遍历

先序遍历二叉树:先序遍历根节点,先序遍历左子树,先序遍历右子树,也就是NLR
中序遍历二叉树:中序遍历左子树,中序遍历根节点,中序遍历右子树,也就是LNR
后序遍历二叉树:后序遍历左子树,后序遍历右子树,后序遍历根节点,也就是LRN
后序序列:ACBFGED
中序序列:ABCDEFG
首先确定D是整个二叉树的根节点,然后在中序序列中找到D则其左边的ABC就是D的左子树,EFG就是 D的右子树。
提取出左字数的后序和中序序列
后序序列:ACB
中序序列: ABC
后序序列的最后一个字符是B则B是当前子树的根节点,然后在中序序列中找到B则左边的A是B的左子树,C是B的右子树。
以此递推就可以得到整个二叉树的结构了,如下图所示

#include<iostream>
#include<cstring>
using namespace std;
char s3[30];
int o=0;
void hou(char s1[],char s2[],int n)  //n记录了左右子树的长度
{
    if(n<=0) return;
    int m=strchr(s2,s1[0])-s2;
    //左子树
    hou(s1+1,s2,m);
    //右子树 
    hou(s1+m+1,s2+m+1,n-m-1);
    s3[o++]=s1[0];
}
void qian(char s1[],char s2[],int n)
{
    if(n<=0) return;
    int m=strchr(s2,s1[n-1])-s2;
    s3[o++]=s1[n-1];
    //左 
    qian(s1,s2,m);
    //右 
    qian(s1+m,s2+m+1,n-m-1);
}
int main()
{
    char s1[30],s2[30];
    while(cin>>s1>>s2)
    {   
        int len=strlen(s1);
        o=0;
        //  前中求后
    //  hou(s1,s2,len); 
        //后中求前
    qian(s1,s2,len);
        for(int i=0;i<len;i++)
        cout<<s3[i];
        cout<<endl;
    }

    return 0;
 } 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值