劍指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

解題思路:

  通常的思路,我們創建一個樹以后,交換沒個節點的左右孩子就行了。

  但是對於這道題,還有個思路,我們創建自己的數據結構,使得數據存儲在一個數組中,這個數組的元素是一個樹的節點,這樣就省去了再創建樹的過程。

#define MAX 1000

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

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

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;
        }

 

  然后,對於一個樹,如果正常前序遍歷,是它自己的樹。而如果按照中右左的順序掃描樹,得到的就是它的鏡像的前序遍歷了。這樣即節省了空間,又節省了交換的時間。

代碼:

 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 ****************************************************************/

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM