剑指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 ****************************************************************/
相关文章
相关标签/搜索