標籤:des style blog http color os io strong
轉載請註明出處:http://blog.csdn.net/ns_code/article/details/25915971
-
-
題目描寫敘述:
-
輸入一個二叉樹,輸出其鏡像。
-
輸入:
-
輸入可能包括多個測試例子,輸入以EOF結束。
對於每一個測試案例,輸入的第一行為一個整數n(0<=n<=1000,n代表將要輸入的二叉樹節點的個數(節點從1開始編號)。接下來一行有n個數字,代表第i個二叉樹節點的元素的值。接下來有n行,每行有一個字母Ci。
Ci=’d’表示第i個節點有兩子孩子,緊接著是左孩子編號和右孩子編號。
Ci=’l’表示第i個節點有一個左孩子,緊接著是左孩子的編號。
Ci=’r’表示第i個節點有一個右孩子,緊接著是右孩子的編號。
Ci=’z’表示第i個節點沒有子孩子。
-
輸出:
-
相應每一個測試案例,
依照前序輸出其孩子節點的元素值。
若為空白輸出NULL。
-
例子輸入:
-
78 6 10 5 7 9 11d 2 3d 4 5d 6 7zzzz
-
例子輸出:
-
8 10 11 9 6 7 5
這道題目與上道題目一樣,採用數組來作為儲存二叉樹節點的資料結構,會使測試代碼更easy編寫。詳細的實現演算法在代碼中比較easy看懂,不細說了,主要想說下,測試時遇到的一些問題(最後AC了):
-
1、先序遍曆的輸出要符合要求的格式,即對於每一個測試用例來說,輸出的各節點元素間要有一個空格,且輸出最後一個元素後要沒有空格,但要輸出一個分行符號,這就要推斷出程式什麼時候遍曆輸出最後一個元素,再遞迴實現的先序遍曆函數中,我沒想到能使最後一個元素符合輸出格式的方法,因此我這裡定義了一個int數組,用來順序儲存先序遍曆的節點的data,這樣直接遍曆輸出該int數組就可以,並再迴圈輸出中推斷要輸出的元素是不是最後一個輸出元素,假設是,就加上分行符號。
2、由於要輸入字元,因此要考慮輸入緩衝隊列的問題,每行含有字元的資料輸入後,會留下分行符號,這樣會在下次輸入字元時被讀取,造成讀取字元的錯誤,因此在下一行資料開始輸入前,要重新整理緩衝區,剛開始圖方面,用了fflush(stdin),在VC++上測試通過了,可是在九度OJ上報了RE,僅僅有一組測試用例通過,多次測試了幾組資料之後,懷疑應該是fflush(stdin)的錯誤,由於有印象在C primer plus上說過,這不是C語言標準裡的東西,想gcc應該不支援,後來在網上查了下,gcc是不支援的,這是微軟在自家編譯器裡加的,因此果斷用while--getchar()來取代,替換後果然AC了,哎!還是水啊,想想離校招還有不到4個月,心裡就沒底!
-
AC代碼:
-
#include<stdio.h>#include<stdlib.h>typedef struct BTNode{int data;int rchild;int lchild;}BTNode;/*推斷pTree1是否包括pTree2*/void MirrorTree(BTNode *pTree,int index){if(pTree == NULL)return;if(index == -1)return;if(pTree[index].lchild==-1 && pTree[index].rchild==-1)return;int temp = pTree[index].lchild;pTree[index].lchild = pTree[index].rchild;pTree[index].rchild = temp;if(pTree[index].lchild!=-1)MirrorTree(pTree,pTree[index].lchild);if(pTree[index].rchild!=-1)MirrorTree(pTree,pTree[index].rchild);}//這裡設定全域變數i的目的是為了將先序遍曆到的元素依次儲存到數組preTraverse中,//其目的是為了確定最後一個輸出元素,這樣好調整輸出的格式,使輸出符合測試系統的要求。int i = 0;void pre_traverse(BTNode *pTree,int index,int *preTraverse,int n){if(pTree == NULL)return;if(index != -1 && i<n){preTraverse[i++] = pTree[index].data;if(pTree[index].lchild != -1)pre_traverse(pTree,pTree[index].lchild,preTraverse,n);if(pTree[index].rchild != -1)pre_traverse(pTree,pTree[index].rchild,preTraverse,n);}}int main(){int n;while(scanf("%d",&n) != EOF){//輸入樹pTree各節點的值BTNode *pTree = NULL;if(n>0){pTree = (BTNode *)malloc(n*sizeof(BTNode));if(pTree == NULL)exit(EXIT_FAILURE);int i,data;//輸入n個節點的datafor(i=0;i<n;i++){scanf("%d",&data);pTree[i].data = data;pTree[i].rchild = -1;pTree[i].lchild = -1;}//輸入n行節點串連關係for(i=0;i<n;i++){char ci;//這兩行的作用是為了跳過緩衝區中的分行符號//這裡不能用fflush(stdin),gcc不支援,這僅僅是一些編譯器自加的,//假設用了,測試系統會報RE。while(getchar() != ‘\n‘)continue;scanf("%c",&ci);if(ci == ‘z‘)continue;else if(ci == ‘l‘){int lindex;scanf("%d",&lindex);pTree[i].lchild = lindex-1;}else if(ci == ‘r‘){int rindex;scanf("%d",&rindex);pTree[i].rchild = rindex-1;}else if(ci == ‘d‘){int lindex,rindex;scanf("%d",&lindex);scanf("%d",&rindex);pTree[i].lchild = lindex-1;pTree[i].rchild = rindex-1;}}}if(n == 0){printf("NULL\n");continue;}MirrorTree(pTree,0);//先將遍曆的元素依次儲存到preTraverse數組中int *preTraverse = (int *)malloc(n*sizeof(int));if(preTraverse == NULL)exit(EXIT_FAILURE);pre_traverse(pTree,0,preTraverse,n);int i;for(i=0;i<n;i++){//是輸出符合測試系統要求的格式if(i == n-1)printf("%d\n",preTraverse[i]);elseprintf("%d ",preTraverse[i]);}free(preTraverse);preTraverse = NULL;free(pTree);pTree = NULL;}return 0;}/************************************************************** Problem: 1521 User: mmc_maodun Language: C Result: Accepted Time:0 ms Memory:916 kb****************************************************************/
寫點小插曲:今天AC了這道題後,順道去科技樓看了下電影《年少輕狂》的拍攝,劇組進駐學校拍攝已經有一周多了,偶爾會在校園的某個地方碰到一些戲份的拍攝,這些天的晚上一直在科技樓前拍南海大學(劇中虛擬大學)畢業舞會的鏡頭,雖說實驗室就在科技樓,但晚上在圖書館自習,所以一直沒去看過,今晚突發奇想,跑去瞄了兩眼,聽周圍人說,前面領舞的女的就是陳妍希,我怎麼看都看不出來,樓底下更是停了各種豪車:保時捷跑車、賓利老爺車。。。。尼瑪演員、導演就是有錢,我等屌絲敲十幾年代碼都敲不出一輛賓利來,人家一部戲下來,神馬都有了!
過來瞄幾眼,就把我今天的跑步給耽誤了,那是別人的舞台,與我無關,回去繼續寫程式。。。。。。
-