大家不会的可以看一下我的一篇文章我是链接-关于二叉树遍历的基础知识
本题要求根据给定的一棵二叉树的后序遍历和中序遍历结果,输出该树的先序遍历结果。
输入格式:
第一行给出正整数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
注意,c编译器不能通过,原因是c编译器不支持(*pe)->data=key这种操作.需要用c++编译器。不能理解二位指针的看我点我
#include<stdio.h>
#include<stdlib.h>
int back[50];
int mid[50];
struct Node{
int data;
struct Node *r,*l;
};
typedef Node node;
node *head=NULL;
int i;
void dff(node **pe, int beg,int end)
{
//这里隐式就是pe=&head;
//所以*pe=head;
//这样我们就不需要返回head的地址了
if(beg>end)
{
return;
}
int key=back[i];
int j;
for(j=beg; j<=end; j++)
{
if(key==mid[j]) break;
}
node *p;
p=(node*)malloc(sizeof(node));
*pe=p;
(*pe)->data=key;
(*pe)->l=NULL;
(*pe)->r=NULL;
i--;
dff(&(*pe)->r,j+1,end);
dff(&(*pe)->l,beg,j-1);
}
void dis_l(node *pe)
{
if(pe!=NULL)
{
printf(" %d",pe->data);
dis_l(pe->l);
dis_l(pe->r);
}
}
void free_l(node *pe)
{
if(pe){
/*if(pe->l)*/ free_l(pe->l);
/*if(pe->r)*/ free_l(pe->r);
free(pe);
}
}
int main(void)
{
int len;
scanf("%d",&len);
for(int j=0; j<len; j++) scanf("%d",back+j);
for(int j=0; j<len; j++) scanf("%d",mid+j);
i=len-1;
dff(&head,0,len-1);//这里把head的地址传进去,于是我们就可以操作head的值了
printf("Preorder:");
dis_l(head);
free_l(head);
return 0;
}