二叉树遍历的非递归实现

二叉树的非递归实现需要使用到下推栈,下面给出前序遍历的完整代码:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #define MAX  10
 4 
 5 
 6 //二叉树存储结构定义
 7 typedef char Item;
 8 typedef struct node *link;
 9 struct node {Item item; link l, r;};
10 
11 int  Create(link *tp);
12 void show(link h);
13 void tranverse(link h, void (*visit)(link));
14 
15 //下推栈存储结构定义
16 typedef link SItem;
17 static SItem *s;
18 static int    N;
19 
20 void  STACKinit(int maxN);
21 int   STACKempty();
22 void  STACKpush(SItem item);
23 SItem STACKpop();
24 
25 
26 int main()
27 {
28     link tree;
29 
30     Create(&tree);
31     tranverse(tree, show);
32 
33     return 0;
34 }
35 
36 void STACKinit(int maxN)
37 {
38     s = (SItem *)malloc(maxN * sizeof(SItem));
39     if (!s) return;
40     N = 0;
41 }
42 
43 int STACKempty()
44 {
45     return N==0;
46 }
47 
48 void STACKpush(SItem item)
49 {
50     s[N++] = item;
51 }
52 
53 SItem STACKpop()
54 {
55     return s[--N];
56 }
57 
58 int Create(link *tp)
59 {
60     //构造方法,或者说构造顺序:中序遍历构造
61     char x;
62     scanf("%c",&x);
63     if(x=='#')
64     {
65         *tp=NULL;//指针为空,树节点中的某个指针为空
66         return 0;
67     }
68     *tp=(link)malloc(sizeof(**tp));//将树节点中指针指向该地址空间
69     if(*tp==NULL)
70         return 0;
71     (*tp)->item=x;
72     Create(&((*tp)->l));
73     Create(&((*tp)->r));
74     return 1;
75 }
76 
77 void show(link h)
78 {
79     printf(" %c ", h->item);
80 }
81 
82 //前序遍历
83 void tranverse(link h, void (*visit)(link))
84 {
85     STACKinit(MAX);
86     STACKpush(h);
87     while (!STACKempty()){
88         (*visit)(h = STACKpop());
89         if (h->r != NULL) STACKpush(h->r);
90         if (h->l != NULL) STACKpush(h->l);
91     }
92 }

 

posted @ 2015-02-01 15:54  XiaoManon  阅读(187)  评论(0编辑  收藏  举报