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(" "); 105 inOrder2(&t1); 106 system("pause"); 107 } 108