- #include<iostream>
- #include<stdlib.h>
- #include<stack>
- #include<queue>
- #include<string>
- using namespace std;
- #define OK 1
- #define ERROR 0
- #define OVERFLOW -2
- typedef int Status;
- typedef char ElemType;
- typedef Status (*Visit)(ElemType e);
- typedef struct BiTNode
- {
- ElemType data;
- struct BiTNode *lchild,*rchild;
- }BiTNode,*BiTree;
- /*
- Status CreateBiTree(BiTree &T,string s) // 非递归按层次从左到右创建
- {
- queue<BiTree> q;
- BiTree p,m;
- if(s[0]=='#') T=NULL;
- else {
- T=new BiTNode;
- T->data=s[0];
- q.push(T); }
- int i=1;
- while(!q.empty())
- {
- p=q.front();
- q.pop();
- if(s[i]!='#') {
- m=new BiTNode;
- m->data=s[i++];
- p->lchild=m;
- q.push(m);
- if(s[i]!='#') {
- m=new BiTNode;
- m->data=s[i++];
- p->rchild=m;
- q.push(m);}
- else p->rchild=NULL;}
- else {
- p->lchild=NULL;
- if(s[i]=='#')
- {p->rchild=NULL;i++;} }
- }
- return OK; }
- */
- Status CreateBiTree(BiTree &T,string str) //非递归先序创建
- {
- int flag,k=0;
- size_t i=0;
- stack<BiTree> s;
- BiTree p,cur;
- if(str[0]=='#') {T=NULL;return OK;}
- while(i<str.size())
- {
- if(str[i]!='#') {
- p=new BiTNode;
- p->data=str[i];
- s.push(p);
- flag=k?3:0;}
- else {flag++; i++;p=NULL;}
- if(!i) {cur=T=p;i++;}
- else
- switch(flag)
- {case 0:
- cur->lchild=p;
- cur=p;i++;
- break;
- case 1:
- cur->lchild=p;
- break;
- case 2:
- cur->rchild=p;s.pop();
- if(i<str.size()) {
- cur=s.top();
- s.pop();}
- k=1;
- break;
- case 3:
- cur->rchild=p;
- cur=p;
- k=0;
- i++;
- flag=0;
- break;};
- }return OK;
- }
- Status PrintElem(ElemType e)
- {
- cout<<e;
- return OK; }
- void PreOrderTraverse(BiTree T,Status(*Visit)(ElemType e)) {
- //非递归先序遍历
- if(!T) return;
- stack<BiTree> s;
- BiTree p=T;
- while(p||!s.empty())
- {
- while(p)
- {
- Visit(p->data);
- s.push(p);
- p=p->lchild; }
- p=s.top()->rchild;
- s.pop();
- }
- cout<<endl;}
- void InOrderTraverse(BiTree T,Status(*Visit)(ElemType e)) {
- //非递归中序遍历
- stack<BiTree> m;
- BiTree p=T;
- while(p||!m.empty())
- if(p) {m.push(p);p=p->lchild;}
- else {
- p=m.top();
- m.pop();
- Visit(p->data);
- p=p->rchild; }
- cout<<endl;}
- void PostOrderTraverse(BiTree T,Status(*Visit)(ElemType e)) {
- //非递归后序遍历
- if(!T) return;
- stack<BiTree> s;
- BiTree p=T,pre=NULL;
- while(p||!s.empty()){
- while(p)
- {
- s.push(p);
- p=p->lchild; }
- p=s.top();
- if(!p->rchild||p->rchild==pre){
- Visit(s.top()->data);
- s.pop();
- pre=p;
- p=NULL;}
- else p=p->rchild;
- }
- cout<<endl;}
- Visit Vis=PrintElem;
- int main()
- {
- BiTree T;
- string s;
- cin>>s;
- CreateBiTree(T,s);
- PreOrderTraverse(T,Vis);
- InOrderTraverse(T,Vis);
- PostOrderTraverse(T,Vis);
- return 0; }
二叉树的几种非递归建立与遍历的实现
最新推荐文章于 2022-11-05 17:00:50 发布