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=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 }?
轉載于:https://www.cnblogs.com/hakase/p/5947548.html
總結
以上是生活随笔為你收集整理的1020. Tree Traversals (25) PAT甲级真题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 坑爹的微信授权配置
- 下一篇: 笨方法学python--变量和命名