您的位置:首页 > 其它

递归建立普通二叉树两种方式遍历

2017-09-22 17:45 501 查看
#include<bits/stdc++.h>
using namespace std;
struct BinNode
{
char data;
BinNode* lchild;
BinNode* rchild;
};
int CreateBinTree1(BinNode* &T)//建立时候按先序建立,先画出来对照先序输入中间无空格
{
char data;
data=getchar();
if(data=='#')
T=NULL;
else
{
T=new BinNode();
T->data=data;
CreateBinTree1(T->lchild);
CreateBinTree1(T->rchild);
}
return 0;
}
void Visit(BinNode* &T)
{
if(T->data!='#')
cout<<T->data<<" ";
}
void PreOrder(BinNode* &T)
{
if(T!=NULL)
{
Visit(T);
PreOrder(T->lchild);
PreOrder(T->rchild);
}
}
void MidOrder(BinNode* &T)
{
if(T!=NULL)
{
MidOrder(T->lchild);
Visit(T);
MidOrder(T->rchild);
}
}
void PostOrder(BinNode* &T)
{
if(T!=NULL)
{
PostOrder(T->lchild);
PostOrder(T->rchild);
Visit(T);
}
}
void PreOrder2(BinNode* &T)
{
stack<BinNode*> stack;
BinNode* p=T;
while(p||!stack.empty())
{
if(p!=NULL)
{
stack.push(p);
cout<<p->data<<" ";
p=p->lchild;
}
else
{
p=stack.top();
stack.pop();
p=p->rchild;
}
}
}
void MinOrder2(BinNode* &T)
{
BinNode* p=T;
stack<BinNode*> stack;
while(p||!stack.empty())
{
if(p!=NULL)
{
stack.push(p);
p=p->lchild;
}
else
{
p=stack.top();
stack.pop();
cout<<p->data<<" ";
p=p->rchild;
}
}
}
struct Bin
{
BinNode* node;
char flag;
};
void PostOrder2(BinNode* &T)
{
stack<Bin*> stack;
BinNode* p=T;
Bin* b;
while(p!=NULL||!stack.empty())
{
while(p!=NULL)
{
b=new Bin;
b->node=p;
b->flag='L';
stack.push(b);
p=p->lchild;
}
while(!stack.empty()&&(stack.top())->flag=='R')
{
b=stack.top();
stack.pop();
cout<<b->node->data<<" ";
}
if(!stack.empty())
{
b=stack.top();
b->flag='R';
p=b->node;
p=p->rchild;
}
}
}
int main()
{
BinNode* T=NULL;
CreateBinTree1(T);
PreOrder(T);
cout<<endl;
MidOrder(T);
cout<<endl;
//char* ch="111";
//cout<<*ch;
PostOrder(T);
cout<<endl;
PreOrder2(T);
cout<<endl;
MinOrder2(T);
cout<<endl;
PostOrder2(T);
return 0;
}







                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: