noj.18.建立二叉树的二叉链表

(已知二叉树的先序和中序求后序)

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include <string>
using namespace std;

string s1,s2;

typedef struct bitnode
{
    char data;
    struct bitnode* lchild;
    struct bitnode* rchild;
}bitnode,*bitree;

bitree create(int ileft1,int iright1,int ileft2,int iright2)
{
    bitree t=(bitree)malloc(sizeof(bitnode));
    t->data=s1[ileft1];
    t->lchild=NULL;
    t->rchild=NULL;
    int mid=s2.find(s1[ileft1]);
    if(mid>ileft2)//有左子树
        t->lchild=create(ileft1+1,ileft1+mid-ileft2,ileft2,mid-1);
    if(mid<iright2)//有右子树
        t->rchild=create(ileft1+1+mid-ileft2,iright1,mid+1,iright2);
    return t;
}

void postprint(bitree t)//后序输出
{
    if(t->lchild!=NULL)
        postprint(t->lchild);
    if(t->rchild!=NULL)
        postprint(t->rchild);
    printf("%c",t->data);
}

int main()
{
    cin>>s1>>s2;
    bitree T;
    T=create(0,s1.length()-1,0,s2.length()-1);
    postprint(T);
	return 0;
}

其中ileft1,iright1分别为s1数组(先序数组)的头序号和尾序号。ileft2,iright2分别为s2数组(中序数组)的头序号和尾序号。mid为根结点所在位置序号。

还有一种简便做法

#include <iostream>
#include <string>
#include <cstdio>
using namespace std;

string s1, s2;

void pre_in_postcal(int ileft1,int iright1,int ileft2,int iright2)
{
	int mid = s2.find(s1[ileft1]);
	if (mid > ileft2)
		pre_in_postcal(ileft1 + 1, ileft1 + mid - ileft2, ileft2, mid - 1);
	if (mid < iright2)
		pre_in_postcal(ileft1 + 1 + mid - ileft2, iright1, mid + 1, iright2);
	cout << s1[ileft1];
}

int main()
{
	cin >> s1 >> s2;
	pre_in_postcal(0, s1.length() - 1, 0, s2.length() - 1);
}

运行界面

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

王梓同

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

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

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

打赏作者

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

抵扣说明:

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

余额充值