1 #include <iostream>
2 using namespace std;
3 typedef struct bintree_node
4 {
5 int data;
6 bintree_node *lchild;
7 bintree_node *rchild;
8 }bintree_node;
9
10 typedef struct stack
11 {
12 bintree_node *data[100];
13 int tag[100];//为栈中每个元素设置标记,用于后序遍历
14 int top;
15 }seqstack;
16
17 void push(seqstack *s, bintree_node *p)
18 {
19 s->data[++s->top] = p;
20 }
21
22 bintree_node *pop(seqstack *s)
23 {
24 if(s->top != -1)
25 {
26 s->top--;
27 return (s->data[s->top + 1]);
28 }
29 else
30 return NULL;
31 }
32
33 bintree_node *bintree_create()
34 {
35 bintree_node *p = (bintree_node *)malloc(sizeof(bintree_node));
36 if(NULL == p)
37 {
38 cout << "alloc memory error!!!" << endl;
39 return NULL;
40 }
41 cin >> (p->data);
42 if(p->data == -1)
43 {
44 return NULL;
45 }
46 p->lchild = bintree_create();
47 p->rchild = bintree_create();
48 return p;
49 }
50
51 void prebintree(bintree_node *p)//前序遍历递归实现
52 {
53 if(p)
54 {
55 cout << p->data << "\t";
56 prebintree(p->lchild);
57 prebintree(p->rchild);
58 }
59 }
60 void prebintree1(bintree_node *p)//前序遍历非递归实现
61 {
62 seqstack s;
63 s.top = -1;
64 while ((p) || (s.top != -1))
65 {
66 while (p)
67 {
68 cout << p->data << "\t";
69 s.top++;
70 s.data[s.top] = p;
71 p = p->lchild;
72 }
73 if(s.top > -1)
74 {
75 p = pop(&s);
76 p = p->rchild;
77 }
78 }
79 }
80 void levelTraverse(bintree_node *p)
81 {
82 bintree_node *queue[20];
83 bintree_node *tmp;
84 int front = 0, rear = 0;//表示队头指针和队尾指针
85 if(p)
86 {
87 tmp = p;//根指针入队
88 queue[rear] = tmp;
89 rear = (rear + 1)%20;//队尾指针加一对20取余,可实现循环队列,合理利用空间
90 while(front != rear)//队不空
91 {
92 tmp = queue[front];//出队,将值赋给tmp
93 cout << tmp->data;
94 front = (front + 1)%20;
95 if(tmp -> lchild)//如果tmp有左子树,将左子树入队
96 {
97 queue[rear] = tmp->lchild;
98 rear = (rear + 1)%20;
99 }
100 if(tmp->rchild)//如果tmp有右子树,将右子树入队
101 {
102 queue[rear] = tmp->rchild;
103 rear = (rear + 1)%20;
104 }
105 }
106 }
107 }
108 int main()
109 {
110 bintree_node *p = bintree_create();
111 prebintree1(p);
112 levelTraverse(p);
113 cout << endl;
114 return 0;
115 }