建树
BinTree CreateBinTree_NRecursion()
{
queue<BinTree> q;
BinTreeNode * s,* p,* bt;
char ch;
int cnt=-1;
cin>>ch;
bt=NULL;
while(ch!='#')
{
s=NULL;
if(ch!='@')
{
s=(BinTree)malloc(sizeof(BinTreeNode));
s->data=ch;
s->leftchild=s->rightchild=NULL;
}
q.push(s);
cnt++;
if(cnt==0)
{
bt=s;
}
else
{
p=q.front();
if(s!=NULL&&p!=NULL)
{
if(cnt%2==1)
{
p->leftchild=s;
}
else
{
p->rightchild=s;
}
}
if(cnt%2==0)
{
q.pop();
}
}
cin>>ch;
}
return bt;
}
先序遍历 版本1
void PreOrder_NRecursion1(BinTree bt)
{
stack<BinTree> astack;
BinTreeNode * p;
astack.push(bt);
while(!astack.empty())
{
p=astack.top();
astack.pop();
cout<<p->data<<" ";
if(p->rightchild!=NULL)
{
astack.push(p->rightchild);
}
if(p->leftchild!=NULL)
{
astack.push(p->leftchild);
}
}
}
先序遍历 版本2
void PreOrder_NRecursion2(BinTree bt)
{
stack<BinTree> astack;
BinTreeNode * p=bt;
if(bt==NULL)
{
return;
}
astack.push(bt);
while(!astack.empty())
{
p=astack.top();
astack.pop();
while(p!=NULL)
{
cout<<p->data<<" ";
if(p->rightchild!=NULL)
{
astack.push(p->rightchild);
}
p=p->leftchild;
}
}
}
中序遍历
void InOrder_NRecursion(BinTree bt)
{
stack<BinTree> astack;
BinTree p;
p=bt;
if(p==NULL)
{
return;
}
astack.push(bt);
p=p->leftchild;
while(p||!astack.empty())
{
while(p!=NULL)
{
astack.push(p);
p=p->leftchild;
}
p=astack.top();
astack.pop();
cout<<p->data<<" ";
p=p->rightchild;
}
}
后序遍历
void PostOrder_NRecursion(BinTree bt)
{
BinTree p=bt;
stack<BinTree> astack;
if(bt==NULL)
{
return ;
}
while(p!=NULL||!astack.empty())
{
while(p!=NULL)
{
astack.push(p);
p=p->leftchild?p->leftchild:p->rightchild;
}
p=astack.top();
astack.pop();
cout<<p->data<<" ";
if(!astack.empty()&&(astack.top()->leftchild==p))
{
p=astack.top()->rightchild;
}
else
{
p=NULL;
}
}
}