#include <iostream> #include <cstring> #include <string> #include <cstdlib> #include <queue> #include <cstdio> #include <stack> using namespace std; typedef struct node { char data[100]; node *lt,*rt; bool ltag,rtag; } tree; bool flag,root; char in[100]; void TreeNodeSet(tree *&t)//初始化指针 { t=(tree*)malloc(sizeof(tree)); t->lt=NULL; t->rt=NULL; t->ltag=true; t->rtag=true; return ; } void DfsTagSet(tree *&t)//初始化节点标记 { if(t==NULL)return ; t->ltag=true; t->rtag=true; DfsTagSet(t->lt); DfsTagSet(t->rt); return ; } void ClearQue(queue<tree**> &q)//清空队列 { while(!q.empty()) { q.pop(); } return ; } void CreatBsTree(tree *&t)//按层次建立二叉树 { queue<tree**> q; int n; cout<<"tree's level:"; cin>>n; TreeNodeSet(t); q.push(&t); for(int lev=0; lev<n; lev++) { int len=q.size(); for(int i=0; i<len; i++) { tree **tmp=q.front(); q.pop(); cout<<"level "<<lev+1<<" no "<<i+1<<":"; scanf("%s",in); if(strcmp(in,"NULL")==0) { free(*tmp); (*tmp)=NULL; } else { strcpy((*tmp)->data,in); if(lev!=n-1) { TreeNodeSet((*tmp)->lt); q.push(&((*tmp)->lt)); TreeNodeSet((*tmp)->rt); q.push(&((*tmp)->rt)); } } } } ClearQue(q); } void PreOrderDfs(tree *&t)//递归先序遍历 { if(t==NULL)return ; flag?cout<<t->data:cout<<" "<<t->data; flag=false; PreOrderDfs(t->lt); PreOrderDfs(t->rt); return ; } void MidOrderDfs(tree *&t)//递归中序遍历 { if(t==NULL)return ; MidOrderDfs(t->lt); flag?cout<<t->data:cout<<" "<<t->data; flag=false; MidOrderDfs(t->rt); return ; } void LastOrderDfs(tree *&t)//递归后序遍历 { if(t==NULL)return ; LastOrderDfs(t->lt); LastOrderDfs(t->rt); flag?cout<<t->data:cout<<" "<<t->data; flag=false; return ; } void PreOrderStack(tree *&t)//非递归先序遍历 { stack<tree*> s; s.push(t); while(!s.empty()) { tree *tmp=s.top(); s.pop(); flag?cout<<tmp->data:cout<<" "<<tmp->data; flag=false; if(tmp->rt!=NULL) s.push(tmp->rt); if(tmp->lt!=NULL) s.push(tmp->lt); } return ; } void MidOrderStack(tree *&t)//非递归中序遍历 { stack<tree *> s; s.push(t); while(!s.empty()) { tree *tmp=s.top(); if(tmp->ltag&&tmp->lt!=NULL) s.push(tmp->lt),tmp->ltag=false; else { s.pop(); flag?cout<<tmp->data:cout<<" "<<tmp->data; flag=false; if(tmp->rtag&&tmp->rt!=NULL) s.push(tmp->rt),tmp->rtag=false; } } return ; } void LastOrderStack(tree *&t)//非递归后序遍历 { DfsTagSet(t); stack<tree*> s; s.push(t); while(!s.empty()) { tree *tmp=s.top(); if((!tmp->ltag)&&(!tmp->rtag)) { flag?cout<<tmp->data:cout<<" "<<tmp->data; flag=false; s.pop(); } if(tmp->rtag&&tmp->rt!=NULL) s.push(tmp->rt); tmp->rtag=false; if(tmp->ltag&&tmp->lt!=NULL) s.push(tmp->lt); tmp->ltag=false; } return ; } void BsTree(tree *&t)//二叉树建立以及输出 { CreatBsTree(t); cout<<"DFS:"<<endl; cout<<"The PreOrderDfsTraversal:"<<endl<<"{ "; flag=true; PreOrderDfs(t); cout<<" }"<<endl; cout<<"The MidOrderDfsTraversal:"<<endl<<"{ "; flag=true; MidOrderDfs(t); cout<<" }"<<endl; cout<<"The LastOrderDfsTraversal:"<<endl<<"{ "; flag=true; LastOrderDfs(t); cout<<" }"<<endl; cout<<"STACK:"<<endl; cout<<"The PreOrderStackTraversal:"<<endl<<"{ "; flag=true; PreOrderStack(t); cout<<" }"<<endl; cout<<"The MidOrderStackTraversal:"<<endl<<"{ "; flag=true; MidOrderStack(t); cout<<" }"<<endl; cout<<"The LastOrderStackTraversal:"<<endl<<"{ "; flag=true; LastOrderStack(t); cout<<" }"<<endl; return ; } void CreatTree(tree *pre,tree *&t)//兄弟表示法建造树 { in[0]='n'; TreeNodeSet(t); if(pre==NULL) cout<<"The tree's root:"<<endl,root=false; else cout<<"Father's Node:"<<pre->data<<endl; cout<<"Node's Data:"; scanf("%s",t->data); if(pre!=NULL) { cout<<"Current Node:"<<t->data<<endl; cout<<"Have brother?[No or Yes]"; scanf("%s",in); } if(in[0]=='y'||in[0]=='Y') { cout<<endl; CreatTree(t,t->rt); } cout<<"Current Node:"<<t->data<<endl; cout<<"Have child?[No or Yes]"; scanf("%s",in); if(in[0]=='y'||in[0]=='Y') { cout<<endl; CreatTree(t,t->lt); } cout<<endl; return ; } void Tree_PreOrderDfs(tree *&t)//先序遍历普通树 { if(t==NULL)return ; flag?cout<<t->data:cout<<" "<<t->data; flag=false; Tree_PreOrderDfs(t->lt); Tree_PreOrderDfs(t->rt); return ; } void Tree_LastOrderDfs(tree *&t)//后序遍历普通树 { if(t==NULL)return ; Tree_LastOrderDfs(t->lt); flag?cout<<t->data:cout<<" "<<t->data; flag=false; Tree_LastOrderDfs(t->rt); return ; } void Tree(tree *&t) { CreatTree(NULL,t); cout<<" "; flag=true; cout<<"Tree's PreOrderIntraversal:"; Tree_PreOrderDfs(t); cout<<endl; flag=true; cout<<"Tree's LastOrderIntraversal:"; Tree_LastOrderDfs(t); cout<<endl; return ; } int main() { string type; while(cout<<"tree's type[bstree or tree]:"&&cin>>type) { tree *bst,*t; switch(type[0]) { case 'b':case 'B': { BsTree(bst); break; } case 't':case 'T': { Tree(t); break; } } } return 0; }