1 #include<iostream>
2 #include<stack>
3
4 using namespace std;
5
6 //双孩子表示法
7 typedef struct treenode
8 {
9 treenode* leftchild;
10 treenode* rightchild;
11 int data;
12 }Treenode,*pTreenode;
13
14
15 //树中序遍历的非递归方法
16 //算法思想:
17 //1.如果节点有左子树,该节点入栈;如果节点没有左子树,访问该节点
18 //2.如果节点有右子树,重复步骤1;如果节点没有右子树(节点访问完毕),根据栈顶指示回退,访问栈顶元素,并访问右子树,重复步骤1
19 //3.如果栈为空,则遍历结束
20 //注意:入栈的节点表示该节点本身没有被访问过,同时右子树也没有被访问过
21 void Midrev(pTreenode root,stack<pTreenode> &s)
22 {
23 if(!root)
24 {
25 return;
26 }
27
28 //步骤1
29 if(root->leftchild)
30 {
31 s.push(root);
32 Midrev(root->leftchild,s);
33 }
34
35 else if(!root->leftchild)
36 {
37 cout<<root->data<<" ";
38 }
39
40 //步骤2.3
41 while(!s.empty())//判断的条件即是步骤3,这句while()是整个程序的精华!
42 {
43 if(root->rightchild)
44 {
45 Midrev(root->rightchild,s);
46 }
47
48 else if(!root->rightchild)
49 {
50 if(!s.empty())
51 {
52 pTreenode befroot=s.top();
53 cout<<befroot->data<<" ";
54 s.pop();
55 Midrev(befroot->rightchild,s);
56 }
57 }
58 }
59 }
60
61
62 int main()
63 {
64 //建立一棵树
65 Treenode t1,t2,t3,t4,t5,t6,t7;//这里不要定义成pTreenode t1的形式,不然下面memset()时会出错
66 memset(&t1,0,sizeof(Treenode));
67 memset(&t2,0,sizeof(Treenode));
68 memset(&t3,0,sizeof(Treenode));
69 memset(&t4,0,sizeof(Treenode));
70 memset(&t5,0,sizeof(Treenode));
71 memset(&t6,0,sizeof(Treenode));
72 memset(&t7,0,sizeof(Treenode));
73
74 t1.data=1;
75 t2.data=2;
76 t3.data=3;
77 t4.data=4;
78 t5.data=5;
79 t6.data=6;
80 t7.data=7;
81 t1.data=1;
82
83 t1.leftchild=&t2;
84 t1.rightchild=&t3;
85 t2.leftchild=&t4;
86 t3.leftchild=&t5;
87 t3.rightchild=&t6;
88 t4.rightchild=&t7;
89
90 //创建一个栈,用来存储树中的元素
91 stack<pTreenode> sta;
92
93 //中序遍历的非递归实现
94 cout<<"中序遍历的非递归实现:";
95 Midrev(&t1,sta);
96 cout<<endl;
97
98 return 0;
99 }