劍指OFFER之二叉樹的鏡像(九度OJ1521)

題目描述:

輸入一個二叉樹,輸出其鏡像。數組

 

輸入:

輸入可能包含多個測試樣例,輸入以EOF結束。
對於每一個測試案例,輸入的第一行爲一個整數n(0<=n<=1000,n表明將要輸入的二叉樹節點的個數(節點從1開始編號)。接下來一行有n個數字,表明第i個二叉樹節點的元素的值。接下來有n行,每行有一個字母Ci。
Ci=’d’表示第i個節點有兩子孩子,緊接着是左孩子編號和右孩子編號。
Ci=’l’表示第i個節點有一個左孩子,緊接着是左孩子的編號。
Ci=’r’表示第i個節點有一個右孩子,緊接着是右孩子的編號。
Ci=’z’表示第i個節點沒有子孩子。數據結構

 

輸出:

對應每一個測試案例,
按照前序輸出其孩子節點的元素值。
若爲空輸出NULL。測試

 

樣例輸入:
7
8 6 10 5 7 9 11 d 2 3 d 4 5 d 6 7 z z z z

 

樣例輸出:
8 10 11 9 6 7 5

解題思路:

  一般的思路,咱們建立一個樹之後,交換沒個節點的左右孩子就好了。spa

  可是對於這道題,還有個思路,咱們建立本身的數據結構,使得數據存儲在一個數組中,這個數組的元素是一個樹的節點,這樣就省去了再建立樹的過程。code

#define MAX 1000 typedef struct treeElement{ int flag;//用於判斷數組中有沒有元素,有元素的數組元素被初始化爲1 int num; int lchild;//左孩子的下標值 int rchild; }TreeElement; typedef struct treeArr{ TreeElement tree[MAX]; }TreeArr;

  在數據結構使用前,記得要進行初始化blog

for(i=0;i<MAX;i++){ t->tree[i].flag =0; t->tree[i].num = 0; t->tree[i].lchild = 0; t->tree[i].rchild = 0; }

 

  而後,對於一個樹,若是正常前序遍歷,是它本身的樹。而若是按照中右左的順序掃描樹,獲得的就是它的鏡像的前序遍歷了。這樣即節省了空間,又節省了交換的時間。get

代碼:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <memory.h>
 4 #define MAX 1000
 5 int nullTree = 0;  6 typedef struct treeElement{  7     int flag;  8     int num;  9     int lchild; 10     int rchild; 11 }TreeElement; 12 typedef struct treeArr{ 13  TreeElement tree[MAX]; 14 }TreeArr; 15  
16 void printfTree(TreeArr *t); 17 void printNode(TreeArr *t,TreeElement *te); 18 int main(){ 19     TreeArr *t = (TreeArr *)malloc(sizeof(TreeArr)); 20     int n; 21     char c; 22     while(scanf("%d",&n)!=EOF && n>=0 && n<=1000){ 23         nullTree = 0; 24         int i,n1,n2; 25         if(n != 0) 26             nullTree = 1; 27         for(i=0;i<MAX;i++){ 28             t->tree[i].flag =0; 29             t->tree[i].num = 0; 30             t->tree[i].lchild = 0; 31             t->tree[i].rchild = 0; 32  } 33          
34         for(i=1;i<=n;i++){ 35             scanf("%d",&t->tree[i].num); 36             t->tree[i].flag = 1; 37             t->tree[i].lchild = 0; 38             t->tree[i].rchild = 0; 39  } 40         for(i=1;i<=n;i++){ 41             scanf("\n%c",&c); 42             if(c == 'd'){ 43                      scanf("%d %d",&n1,&n2); 44                      t->tree[i].lchild = n1; 45                      t->tree[i].rchild = n2; 46  getchar(); 47  } 48             if(c == 'l'){ 49                     scanf("%d",&n1); 50                     t->tree[i].lchild = n1; 51  getchar(); 52  } 53             if(c == 'r'){ 54                      scanf("%d",&n1); 55                      t->tree[i].rchild = n1; 56  getchar(); 57  } 58             if(c == 'z'){ 59  getchar(); 60  } 61  } 62  printfTree(t); 63         printf("\n"); 64  } 65     return 0; 66 } 67 void printfTree(TreeArr *t){ 68     if(nullTree) 69         printNode(t,&t->tree[1]); 70     else
71         printf("NULL"); 72 } 73 void printNode(TreeArr *t,TreeElement *te){ 74     if(!te->flag) 75         return; 76     else{ 77         if(te->num == t->tree[1].num) 78             printf("%d",te->num); 79         else
80             printf(" %d",te->num); 81         if(te->rchild) 82             printNode(t,&t->tree[te->rchild]); 83         if(te->lchild) 84             printNode(t,&t->tree[te->lchild]); 85         return ; 86  } 87 } 88 /************************************************************** 89  Problem: 1521 90  User: xhalo 91  Language: C 92  Result: Accepted 93  Time:0 ms 94  Memory:916 kb 95 ****************************************************************/
相關文章
相關標籤/搜索