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

Posted Madao东治

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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=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=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  4
65     //1 2 3  4  5 6 7
66     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甲级真题的主要内容,如果未能解决你的问题,请参考以下文章

PAT 1020 Tree Traversals (25)

1020 Tree Traversals (25 分)

1020 Tree Traversals (25分)

1020 Tree Traversals (25 分)

1020. Tree Traversals (25)

PAT Advanced 1020 Tree Traversals (25分)