二叉树的非递归中序遍历

  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  

 

posted @ 2018-08-29 15:37  Lxk-  阅读(573)  评论(0)    收藏  举报