二叉树非递归遍历(前序、中序、后序)
前序遍历
void PreOrder(BiNode *bt){
BiNode * p=bt;
stack<BiNode*> s;
while(p!=NULL||!s.empty()){
while(p!=NULL){
cout<<p->data<<" ";
s.push(p);
p=p->lchild;
}
if(!s.empty()){
p=s.top();
s.pop();
p=p->rchild;
}
}
}
中序遍历
void InOrder(BiNode *bt){
stack<BiNode*> s;
BiNode *p=bt;
while(p!=NULL||!s.empty()){
while(p!=NULL){
s.push(p);
p=p->lchild;
}
if(!s.empty()){
p=s.top();
s.pop();
cout<<p->data<<" ";
p=p->rchild;
}
}
}
后序遍历
void PostOrder(BiNode* bt){
BiNode *p=bt;
element elem;
stack<element> s;
while(p!=NULL||!s.empty()){
if(p!=NULL){
elem.ptr=p;
elem.flag=1;
s.push(elem);
p=p->lchild;
}
else{
elem=s.top();
s.pop();
p=elem.ptr;
if(elem.flag==1){
elem.flag=2;
s.push(elem);
p=p->rchild;
}
else{
cout<<p->data<<" ";
p=NULL;
}
}
}
}
完整代码
#include<iostream>
#include<stack>
using namespace std;
struct BiNode{
char data;
BiNode *lchild,*rchild;
};
struct element{
BiNode *ptr;
int flag;
};
void create(BiNode* &bt){
char ch;
cin>>ch;
if(ch=='#') bt=NULL;
else{
bt=new BiNode;
bt->data=ch;
create(bt->lchild);
create(bt->rchild);
}
}
void PreOrder(BiNode *bt){
BiNode * p=bt;
stack<BiNode*> s;
while(p!=NULL||!s.empty()){
while(p!=NULL){
cout<<p->data<<" ";
s.push(p);
p=p->lchild;
}
if(!s.empty()){
p=s.top();
s.pop();
p=p->rchild;
}
}
}
void InOrder(BiNode *bt){
stack<BiNode*> s;
BiNode *p=bt;
while(p!=NULL||!s.empty()){
while(p!=NULL){
s.push(p);
p=p->lchild;
}
if(!s.empty()){
p=s.top();
s.pop();
cout<<p->data<<" ";
p=p->rchild;
}
}
}
void PostOrder(BiNode* bt){
BiNode *p=bt;
element elem;
stack<element> s;
while(p!=NULL||!s.empty()){
if(p!=NULL){
elem.ptr=p;
elem.flag=1;
s.push(elem);
p=p->lchild;
}
else{
elem=s.top();
s.pop();
p=elem.ptr;
if(elem.flag==1){
elem.flag=2;
s.push(elem);
p=p->rchild;
}
else{
cout<<p->data<<" ";
p=NULL;
}
}
}
}
int main(){
BiNode *root;
create(root);
PreOrder(root);
cout<<endl;
InOrder(root);
cout<<endl;
PostOrder(root);
return 0;
}
输入:
AB#D##C##
输出:
A B D C
B D A C
D B C A