1 #include<iostream>
2 #include<stack>
3 using namespace std;
4 //二叉树的数据结构
5 struct BiTNode
6 {
7 int data;
8 struct BiTNode *lchild, *rchild;
9 };
10
11 typedef struct BiTNode BiTNode;
12 typedef struct BiTNode* BiTree;
13 //非递归实现
14 /*
15 步骤1:
16 如果节点有左子树,则入栈;
17 如果节点没有左子树,则访问该节点;
18 步骤2:
19 如果节点有右子树,重复步骤1;
20 如果节点没有右子树,证明节点访问完毕,根据栈顶指示回退,访问栈顶元素,并访问右子树,重复步骤1;
21 如果栈为空,则遍历结束
22 */
23 //找到中序遍历的起点
24 BiTNode* goLeft(BiTNode* root, stack<BiTNode*> &s)
25 {
26 if (root == NULL)
27 {
28 return NULL;
29 }
30 //如果root一直有左孩子 则将root入栈
31 while (root->lchild != NULL)
32 {
33 s.push(root); //入栈
34 root = root->lchild; //往下走
35 }
36
37 //返回起点!
38 return root;
39 }
40 void inOrder2(BiTNode* root)
41 {
42 //定义树起点
43 BiTNode* begin= NULL;
44 //定义栈
45 stack<BiTNode*> myStack;
46 //一直找左子树 直到找到起点
47 begin = goLeft(root, myStack);
48 while(begin)
49 {
50
51 printf("%d ", begin->data);
52 //如果有右子树 重复GOLEFT
53 if (begin->rchild != NULL)
54 {
55 //现在BEGIN 为右子树中序遍历的起点
56 begin = goLeft(begin->rchild, myStack);
57 }
58 //如果begin没有右子树 根据栈顶指示回退
59 else if (!myStack.empty())
60 {
61 begin = myStack.top();
62 myStack.pop();
63 }
64 //如果begin没有右子树 myStack为空
65 else
66 {
67 begin = NULL;
68 }
69 }
70 }
71
72
73 //递归实现中序遍历
74 void inOrder(BiTNode *root)
75 {
76 if (root == NULL)
77 {
78 return;
79 }
80 inOrder(root->lchild);
81 printf("%d ", root->data);
82 inOrder(root->rchild);
83 }
84
85 void main()
86 {
87 BiTNode t1, t2, t3, t4, t5;
88 memset(&t1, 0, sizeof(BiTNode));
89 memset(&t2, 0, sizeof(BiTNode));
90 memset(&t3, 0, sizeof(BiTNode));
91 memset(&t4, 0, sizeof(BiTNode));
92 memset(&t5, 0, sizeof(BiTNode));
93 t1.data = 1;
94 t2.data = 2;
95 t3.data = 3;
96 t4.data = 4;
97 t5.data = 5;
98
99 t1.lchild = &t2;
100 t1.rchild = &t3;
101 t2.lchild = &t4;
102 t2.rchild = &t5;
103 inOrder(&t1);
104 printf("\n");
105 inOrder2(&t1);
106 system("pause");
107 }
108