首页 > 代码库 > 1020. Tree Traversals (25) PAT甲级真题

1020. Tree Traversals (25) PAT甲级真题

之前我看了这道题,实在是看不懂网上的解题答案,他们的具体思路基本上就是通过后续遍历和中序遍历,直接推出层次遍历。

我苦思冥想了半天,是在没看懂这种思路,于是想了一个笨点的但是也比较好理解的思路,通过后续和中序,先推出整个二叉树,再考虑

对二叉树层次遍历。

 

本题还有一点要注意的时在输出结果的末尾,如果使用了类似

pirntf("%d ",data);

这样的格式是不对的,一定要对末尾进行判断消除最尾端的空格。

 

首先最核心的部分是通过两次遍历反推回二叉树:这里的思路是,后续遍历的最末尾,一定是二叉树的根节点,后续遍历决定父子,中序遍历决定左右,从后序遍历找到了根节点后,到中序遍历中去找,找到后,中序遍历的根节点将整个二叉树一分为二,左边的为左节点,右边的为右节点,然后开始往下递归。

PTREE BuildTree(int * post, int *in,int size){    PTREE tree;    int i=0;    if(!size){        return(NULL);    }    tree=(PTREE)malloc(sizeof(TREE));     tree->data=http://www.mamicode.com/post[size-1];    for(i=0;i<size;i++){        if(post[size-1]==in[i])            break;    }    tree->Left=BuildTree(post,in,i);    tree->Right=BuildTree(post+i,in+i+1,size-i-1);    return(tree);}

 

在构建完了二叉树后,后续工作就不难了,要注意输出格式,最后一位不能有空格。附上完整代码:

 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<iostream> 4 #include<queue> 5 using namespace std; 6 typedef struct tree{ 7     int data; 8     struct tree *Left; 9     struct tree *Right;10 }TREE,*PTREE;11 12 int TraversalTree(PTREE tree);13 PTREE BuildTree(int *,int *,int);14 int * TraversalTree_By_Level(PTREE,int);15 16 int main(){17     PTREE tree;18     int count,count1,Temp,i=0,count2;19     scanf("%d",&count);20     int pre[count],in[count];21     count1=count;22     count2=count;23     int size=count;24     while(count1!=0){25         scanf("%d",&Temp);26         pre[i]=Temp;27         i++;28         count1--;29     }30     i=0;31     while(count!=0){32         scanf("%d",&Temp);33         in[i]=Temp;34         i++;35         count--;36     }37     tree=BuildTree(pre,in,size);38     TraversalTree_By_Level(tree,count2);39 40 }41 42 43 int TraversalTree(PTREE tree){44     if(tree==NULL)45         return(0);46     printf("%d ",tree->data);47     TraversalTree(tree->Left);48     TraversalTree(tree->Right);49 }50 51 PTREE BuildTree(int * post, int *in,int size){52     PTREE tree;53     int i=0;54     if(!size){55         return(NULL);56     }57 58     tree=(PTREE)malloc(sizeof(TREE));59     tree->data=http://www.mamicode.com/post[size-1];60     for(i=0;i<size;i++){61         if(post[size-1]==in[i])62             break;63     }64     //2 3 1  5 7 6  465     //1 2 3  4  5 6 766     tree->Left=BuildTree(post,in,i);67     tree->Right=BuildTree(post+i,in+i+1,size-i-1);68     return(tree);69 }70 int * TraversalTree_By_Level(PTREE tree,int count2){71     int a[100];int i=0;int k=0;72     queue<PTREE>q1;73     PTREE Temp;74     q1.push(tree);75     while(!q1.empty()){76         Temp=q1.front();77         q1.pop();78         a[k]=Temp->data;79         k++;80         if(Temp->Left!=NULL)81             q1.push(Temp->Left);82         if(Temp->Right!=NULL)83             q1.push(Temp->Right);84     }85     while(i<count2-1){86         printf("%d ",a[i]);87         i++;88     }89     printf("%d",a[i]);90     return(NULL);91 }

 

1020. Tree Traversals (25) PAT甲级真题