根据后序和中序遍历输出先序遍历
1,学习数据结构的思维应当有所转变,关于树,我之前把它当作一个结构去用,而不懂得变通,很难运用与很多题目,关于树,更应当作为知识点去学习。树的遍历和创建用到了递归和链表,这里的思维逻辑也是利用二叉树建立的二分思想,利用倒序遍历找到树的根,然后利用中序遍历找到根的左右子树分别创建,这里是一个“归”,两个“递”。
2反思:题目自己用链表建树的时候错误在右子树的建立,新的中序遍历数组和新的后序遍历数组初始位置不对
链表建立树
Tree rebuild(int n,int *mid,int *end){
int i;
Tree T;
if(n<=0)return NULL;
T=(Tree)malloc(sizeof(Tnode));
T->data=end[n-1];
T->lchild=T->rchild=NULL;
for(i=0;i<n;i++){
if(mid[i]==T->data)
break;
}
T->lchild=rebuild(i,mid,end) ;
T->rchild=rebuild(n-i-1,mid+i+1,end+i);
return T;
}
完整代码
#include <stdio.h>
#include <stdlib.h>
#define overflow -2
typedef struct node{
int data;
struct node *lchild,*rchild;
}Tnode,*Tree;
Tree rebuild(int n,int *mid,int *end){
int i;
Tree T;
if(n<=0)return NULL;
T=(Tree)malloc(sizeof(Tnode));
T->data=end[n-1];
T->lchild=T->rchild=NULL;
for(i=0;i<n;i++){
if(mid[i]==T->data)
break;
}
T->lchild=rebuild(i,mid,end) ;
T->rchild=rebuild(n-i-1,mid+i+1,end+i);
return T;
}
void first(Tree T){
if(T)
{
printf(" %d",T->data);
first(T->lchild);
first(T->rchild);
}
}
int main() {
int n,i;
int mid[30],end[30];
Tree T=NULL;
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%d",&end[i]);
}
for(i=0;i<n;i++){
scanf("%d",&mid[i]);
}
T=rebuild(n,mid,end);
printf("Preorder:");
first(T);
return 0;
}
学习到了树的二叉思想,关于链表建立树的思维;无论是哪种数据结构,都需要注意规范性,只有不断总结经验,客观求实,才会越来越强。