二叉树的各种遍历

来源:互联网 发布:ricequant 知乎 编辑:程序博客网 时间:2024/06/01 08:55
#include <iostream>#include <stack>#include <queue>#include <utility>#include <assert.h>using namespace std;typedef struct node{char data;node *left;node *right;}BiNode,*BiTree;int CreateBiTreeByPreAndMid(BiTree &root,char *front,char *middle,int len){assert(len!=0);root->data=front[0];int i;for(i=0;i<len;i++){if(middle[i]==root->data)break;}if(i!=0){root->left=new BiNode;CreateBiTreeByPreAndMid(root->left,front+1,middle,i);}elseroot->left=NULL;if(i!=len-1){root->right=new BiNode;CreateBiTreeByPreAndMid(root->right,front+i+1,middle+i+1,len-i-1);}elseroot->right=NULL;return 1;}int CreateBiTreeByMidAndPost(BiTree &t,char *midOrder,char*postOrder,int len){assert(len!=0);t->data=postOrder[len-1];int i;for(i=0;i<len;i++){if(midOrder[i]==t->data)break;}if(i!=0){t->left=new BiNode;CreateBiTreeByMidAndPost(t->left,midOrder,postOrder,i);}elset->left=NULL;if(i!=len-1){t->right=new BiNode;CreateBiTreeByMidAndPost(t->right,midOrder+i+1,postOrder+i,len-i-1);}elset->right=NULL;return 1; }void Visit(BiNode &binode){cout<<binode.data;}void PreOrder(BiTree &t){stack<BiNode*> s;BiNode *p=t;if(p==NULL)return;s.push(p);while(!s.empty()){p=s.top();Visit(*p);s.pop();if(p->right)s.push(p->right);if(p->left)s.push(p->left);}}void PreOrder2(BiTree &t){stack<BiNode*> s;BiNode *p=t;while(p!=NULL || !s.empty()){while(p!=NULL){Visit(*p);s.push(p);p=p->left;}if(!s.empty()){p=s.top();s.pop();p=p->right;}}}void MidOrder(BiTree &t){stack< pair<BiNode*,int> >s;int unUsed;BiNode*p=t;s.push(make_pair(p,1));while(!s.empty()){p=s.top().first;unUsed=s.top().second;s.pop();if(unUsed){if(p->right)s.push(make_pair(p->right,1));s.push(make_pair(p,0));if(p->left)s.push(make_pair(p->left,1));}else{Visit(*p);}}}void MidOrder2(BiTree &t){stack<BiNode*>s;BiNode *p=t;while(p!=NULL || !s.empty()){while(p!=NULL){s.push(p);p=p->left;}if(!s.empty()){p=s.top();Visit(*p);    s.pop();    p=p->right;}}}void PostOrder(BiTree &t){stack< pair<BiNode*,int> >s;int unUsed;BiNode*p=t;s.push(make_pair(p,1));while(!s.empty()){p=s.top().first;unUsed=s.top().second;s.pop();if(unUsed){s.push(make_pair(p,0));if(p->right)s.push(make_pair(p->right,1));if(p->left)s.push(make_pair(p->left,1));}else{Visit(*p);}}}void PostOrder2(BiTree &t){stack<BiNode*>s;BiNode*p=t,*pre=NULL;s.push(p);while(!s.empty()){p=s.top();if((p->left==NULL&&p->right==NULL)||(pre!=NULL&&(p->left==pre||p->right==pre))){Visit(*p);s.pop();pre=p;}else{if(p->right)s.push(p->right);if(p->left)s.push(p->left);}}}void LeverOrder(BiTree &t){queue<BiNode*> q;BiNode *p=t;q.push(p);while(!q.empty()){p=q.front();Visit(*p);q.pop();if(p->left)q.push(p->left);if(p->right)q.push(p->right);}}int main(int argc,char *argv[]){char str1[100],str2[100];BiTree t=new BiNode;freopen("PreAndMid.txt","r",stdin);cin>>str1>>str2;assert(strlen(str1)==strlen(str2));CreateBiTreeByPreAndMid(t,str1,str2,strlen(str1));PreOrder(t);cout<<endl;PreOrder2(t);cout<<endl;MidOrder(t);cout<<endl;MidOrder2(t);cout<<endl;PostOrder(t);cout<<endl;PostOrder2(t);cout<<endl;LeverOrder(t);cout<<endl;return 0;}


0 0
原创粉丝点击