#include<iostream>
#include<vector>
using namespace std;
struct Node{
char val;
Node *left;
Node *right;
};
struct cheryl{
Node *n;
char tag;
};
typedef Node* node;
node insert(Node *root,char ch);
vector<char> cenxu(Node *root);
vector<char> zhongxu(Node *root);
vector<char> qianxu(Node *root);
vector<char> houxu(Node *root);
int main(void){
node root=nullptr;
char a[6]={'A','B','D','C','F','E'};
for(int i=0;i<6;++i)
root=insert(root,a[i]);
cout<<"层序遍历"<<endl;
vector<char> temp=cenxu(root);
for(auto i:temp)
cout<<i<<' ';
cout<<endl;
cout<<"中序遍历"<<endl;
temp=zhongxu(root);
for(auto i:temp)
cout<<i<<' ';
cout<<endl;
cout<<"前序遍历"<<endl;
temp=qianxu(root);
for(auto i:temp)
cout<<i<<' ';
cout<<endl;
cout<<"后序遍历"<<endl;
temp=houxu(root);
for(auto i:temp)
cout<<i<<' ';
cout<<endl;
return 0;
}
node insert(Node *root,char ch){
if(!root){
root=new Node;
root->left=nullptr;
root->right=nullptr;
root->val=ch;}
else if(ch<root->val)
root->left=insert(root->left,ch);
else if(ch>root->val)
root->right=insert(root->right,ch);
return root;
}
vector<char> cenxu(Node *root){
vector<char> result;
if(!root)
return result;
vector<Node*> temp;
temp.push_back(root);
int curr=0;
int last=1;
while(curr<temp.size()){
last=temp.size();
while(curr<last){
result.push_back(temp[curr]->val);
if(temp[curr]->left)
temp.push_back(temp[curr]->left);
if(temp[curr]->right)
temp.push_back(temp[curr]->right);
++curr;
}
}
return result;
}
vector<char> zhongxu(Node *root){
vector<char> result;
if(!root)
return result;
vector<Node*> temp;
Node *p=root;
while(p||!temp.empty()){
if(p){
temp.push_back(p);
p=p->left;
}
else{
p=temp.back();
temp.pop_back();
result.push_back(p->val);
p=p->right;
}
}
return result;
}
vector<char> qianxu(Node *root){
vector<char> result;
if(!root)
return result;
vector<Node*> temp;
Node *p=root;
while(p||!temp.empty()){
if(p){
result.push_back(p->val);
temp.push_back(p);
p=p->left;}
else{
p=temp.back()->right;
temp.pop_back();
}
}
return result;
}
vector<char> houxu(Node *root){
vector<char> result;
if(!root)
return result;
vector<cheryl*> temp;
Node *p=root;
cheryl *c;
while(p||!temp.empty()){
while(p){
c=new cheryl;
c->n=p;
c->tag='N';
temp.push_back(c);
p=p->left;
}
while(!temp.empty()&&temp.back()->tag=='R'){
c=temp.back();
result.push_back((c->n)->val);
temp.pop_back();
}
if(!temp.empty()){
c=temp.back();
c->tag='R';
p=c->n->right;
}
}
return result;
}
二叉树四种遍历(非递归)
最新推荐文章于 2018-05-13 09:29:54 发布