二叉树知先序和中序求后序||二叉树知后序和中序求先序(数组递归实现)

知先序和中序求后序

7-42 重构二叉树 (25 分)
给出两个字符串,分别表示二叉树的先序遍历(根、左子树、右子树)和中序遍历(左子树、根、右子树)的结果。
例如,对于下面的二叉树,先序遍历结果是DBACEGF,中序遍历结果是ABCDEFG。
在这里插入图片描述

假定二叉树的每个节点都用大写的字母标识,且对于同一棵二叉树,同一个字母不会用两次。现在请你根据给出的先序遍历和中序遍历,重构这棵二叉树。
输入格式:

输入包含一个或多个测试用例。每个测试用例一行,给出两个字符串,表示对二叉树进行先序遍历和中序遍历的结果。这两个字符串都是由大写字母组成(因此它们的长度不超过26)。

输出格式:

将每个测试用例转化为一棵二叉树,并在一行中输出树的后序遍历(左子树、右子树、根)的结果。

输入样例:

DBACEGF ABCDEFG
BCAD CBAD

输出样例:

ACBFGED
CDAB

AC代码:

#include<iostream>
#include<cstring>
using namespace std;
string s1,s2;
void tree(int r1,int l1,int r2,int l2)
{
	if(r1>l1)
	return;
	int root=s2.find(s1[r1]);
	tree(r1+1,r1+root-r2,r2,root-1);
	tree(r1+root-r2+1,l1,root+1,l2);
	cout<<s1[r1];
}
int main()
{
	while(cin>>s1>>s2){
	tree(0,s1.length()-1,0,s2.length()-1);
        cout<<endl;
}
}

知后序和中序求先序

7-13 根据后序和中序遍历输出先序遍历 (25 分)
本题要求根据给定的一棵二叉树的后序遍历和中序遍历结果,输出该树的先序遍历结果。

输入格式:

第一行给出正整数N(≤30),是树中结点的个数。随后两行,每行给出N个整数,分别对应后序遍历和中序遍历结果,数字间以空格分隔。题目保证输入正确对应一棵二叉树。

输出格式:

在一行中输出Preorder: 以及该树的先序遍历结果。数字间有1个空格,行末不得有多余空格。

输入样例:

7
2 3 1 5 7 6 4
1 2 3 4 5 6 7

输出样例:

Preorder: 4 1 3 2 6 5 7

AC代码:

#include<stdio.h>
int a[100000],b[10000],n;
void fun(int r1,int l1,int r2,int l2)
{
    int i,sum=0;
    if(r1>l1)
        return ;
    for(i=0;b[i]!=a[l1];i++);
    printf(" %d",a[l1]);
    fun(r1,l1-l2+i-1,r2,i-1);
    fun(l1-l2+i,l1-1,i+1,l2);
}
int main()
{
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
		scanf("%d",&a[i]);
	}for(int i=0;i<n;i++)
	{
		scanf("%d",&b[i]);
	}
	printf("Preorder:");
	fun(0,n-1,0,n-1); 
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

giao源

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

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

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

打赏作者

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

抵扣说明:

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

余额充值