二叉树的3种非递归遍历


#include <iostream> #include <stack> using namespace std; //二叉链表示法 typedef struct BiTNode { char data; struct BiTNode *lchild,*rchild; }BiTNode,*BiTree; void preOrder(BiTNode *r)//先序遍历(先遍历根然后遍历左子树最后遍历右子树) { if(r==NULL) { return ; } stack<BiTNode*> s; while(!s.empty()||r!=NULL) { while(r!=NULL) { cout<<r->data<<" ";//访问根节点 s.push(r);//入栈 r=r->lchild; } if(!s.empty()) { r=s.top();//从栈顶拿到元素 s.pop();//弹出栈顶元素 r=r->rchild; } } } void inOrder(BiTNode *r)//中序遍历(先遍历左子树然后遍历根最后遍历右子树) { stack<BiTNode*> s; while(r!=NULL||!s.empty()) { while(r!=NULL)//遍历左子树 { s.push(r); r=r->lchild; }//endwhile if(!s.empty()) { r=s.top(); cout<<r->data<<" "; //访问根结点 s.pop(); r=r->rchild; //通过下一次循环实现右子树遍历 } } } void postOrder(BiTNode *r)//后序遍历(先遍历左子树然后遍历右子树最后遍历根) {//这里以第二种思想遍历 if(r==NULL) { return ; } stack<BiTNode*> s; BiTNode *cur;//当前结点 BiTNode *pre=NULL;//前一次访问的结点 s.push(r); while(!s.empty()) { cur=s.top(); //如果当前结点没有孩子结点或者孩子节点都已被访问过 if((cur->lchild==NULL&&cur->rchild==NULL)||(pre!=NULL&&(pre==cur->lchild||pre==cur->rchild))) { cout<<cur->data<<" "; s.pop(); pre=cur; } else { if(cur->rchild!=NULL) s.push(cur->rchild); if(cur->lchild!=NULL) s.push(cur->lchild); } } } void main() { //创建树的节点 BiTNode a={'A',NULL,NULL}; BiTNode b={'B',NULL,NULL}; BiTNode c={'C',NULL,NULL}; BiTNode d={'D',NULL,NULL}; BiTNode e={'E',NULL,NULL}; BiTNode f={'F',NULL,NULL}; BiTNode g={'G',NULL,NULL}; BiTNode h={'H',NULL,NULL}; BiTNode i={'I',NULL,NULL}; //建立关系 a.lchild=&b; a.rchild=&e; b.rchild=&c; c.lchild=&d; e.rchild=&f; f.lchild=&g; g.lchild=&h; g.rchild=&i; //树的遍历 printf("先序遍历:"); preOrder(&a); printf(" "); printf("中序遍历:"); inOrder(&a); printf(" "); printf("后序遍历:"); postOrder(&a); printf(" "); system("pause"); }

  

原文地址:https://www.cnblogs.com/jueshi0208/p/5546106.html