根据后序和中序遍历输出先序遍历

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

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

输入样例:
7
2 3 1 5 7 6 4
1 2 3 4 5 6 7
1.建树-储存-先序访问

#include<stdio.h>
#include <stdlib.h>

typedef struct TreeNode *BinTree;
typedef BinTree Position;
struct TreeNode{
    int Data;
    BinTree Left;
    BinTree Right;
};

BinTree CreatTree(int a[],int b[],int n)
{
    BinTree T=NULL;
    if(n>0)
    {
        int i;
        T=(BinTree)malloc(sizeof(struct TreeNode));
        T->Left=T->Right=NULL;
        T->Data=a[n-1];
        for(i=0;i<n;i++)
            if(T->Data==b[i])
                break;
        int right_n=n-1-i;
        int left_n=i;
        if(right_n>=0)
            T->Right=CreatTree(&a[left_n],&b[left_n+1],right_n);
        if(left_n>=0)
            T->Left=CreatTree(a,b,left_n);
    }
    return T;
}

void PrintPreTraversal(BinTree BT)
{
    if(BT)
    {
        printf(" %d",BT->Data);
        PrintPreTraversal(BT->Left);
        PrintPreTraversal(BT->Right);
    }
}

int main()
{
    BinTree T;
    int n,post_a[30],in_a[30];
    scanf("%d",&n);
    for(int i=0;i<n;i++)
        scanf("%d",&post_a[i]);
    for(int i=0;i<n;i++)
        scanf("%d",&in_a[i]);
    printf("Preorder:");
    T=CreatTree(post_a,in_a,n);
    PrintPreTraversal(T);
    return 0;
}

2.数组存储-直接输出

#include<stdio.h>
int solve(int *post,int *in,int n)
{
	int i,L,R,root;
	if(n==0) return; 
	if(n==1) root=post[0];
	root=post[n-1];
	printf(" %d",root);
	for(i=0;i<n;i++)
		if(root==in[i])
			break;
	L=i;R=n-1-i;
	solve(post,in,L);				//左树查找
	solve(&post[L],&in[L+1],R);		//右树查找
	return; 
}
int main()
{
	int i,n,post_a[30],in_a[30];
    scanf("%d",&n);
    for(i=0;i<n;i++)
        scanf("%d",&post_a[i]);
    for(i=0;i<n;i++)
        scanf("%d",&in_a[i]);
	printf("Preorder:");
	solve(post_a,in_a,n);
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值