非递归前中后序遍历(多种方式)

来源:互联网 发布:小米网络机顶盒看卫视 编辑:程序博客网 时间:2024/05/17 04:15
#include <iostream>#include <stack>using namespace std;struct Node{Node* lchild;Node* rchild;char value;};class list{public:list::list();void PreOrder();void InOrder();void PostOrder();void PostOrder2();private:Node* root;};list::list(){cout<<"请输入您要输入的数字,按#键退出"<<endl;char i;cin>>i;if(i=='#')return;root=new Node;root->value=i;root->lchild=NULL;root->rchild=NULL;Node *p,*q;while(1){cin>>i;if(i=='#')break;p=new Node;p->value=i;p->lchild=NULL;p->rchild=NULL;q=root;while(q){if(p->value<q->value){if(q->lchild)q=q->lchild;else{q->lchild=p;break;}}else{if(q->rchild)q=q->rchild;else{q->rchild=p;break;}}}}}void list::PreOrder(){stack<Node*> s;Node* curr=root;while(1){while(curr){cout<<curr->value<<"  ";if(curr->rchild)s.push(curr->rchild);curr=curr->lchild;}if(s.empty())break;curr=s.top();s.pop();}}void list::InOrder(){stack<Node*> s;Node* curr=root;while(1){while(curr){s.push(curr);curr=curr->lchild;}if(s.empty())break;curr=s.top();cout<<curr->value<<" ";s.pop();curr=curr->rchild;}}void list::PostOrder(){   if(!root)   return;   stack<Node*> s;   Node* curr=root;   Node* temp=NULL;   while(1){   while(curr){     s.push(curr);   curr=curr->lchild;   }   if(s.empty())   break;   curr=s.top();   if(curr->rchild==NULL || curr->rchild==temp){   cout<<curr->value<<" ";   temp=curr;   s.pop();   curr=NULL;   }   else   curr=curr->rchild;   }}void list::PostOrder2(){stack<Node*> s;Node *curr=root,*temp=NULL;while(1){while(curr){    s.push(curr);if(curr->rchild)s.push(curr->rchild);curr=curr->lchild;}if(s.empty())break;curr=s.top();if(curr->rchild==NULL || curr->rchild==temp){cout<<curr->value<<"  ";temp=curr;            s.pop();curr=NULL;}elses.pop();}}void main(){list test;test.PostOrder();system("pause");}

0 0
原创粉丝点击