二叉树四种遍历(非递归)

来源:互联网 发布:ie修复软件 编辑:程序博客网 时间:2024/05/16 07:20
#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;}

0 0