#include<iostream>
#include<stack>
#include<queue>
using namespace std;
typedef struct Node
{
char data;
Node*lchild;
Node*rchild;
}Node;
//创建一个节点
Node*BuyNode()
{
Node* p = new(nothrow)Node;
if(p==NULL)
{
exit(-1);
}
memset(p,0,sizeof(Node));
return p;
}
//创建一棵二叉树
Node* CreateTree(char *&s)
{
if(s==NULL)
{
return NULL;
}
Node*p=NULL;
if((*s) != '$')
{
p = BuyNode();
p->data = *s;
p->lchild = CreateTree(++s);
p->rchild = CreateTree(++s);
}
return p;
}
//先序递归遍历
void Frond(Node*p)
{
if(p)
{
cout<<p->data<<' ';
Frond(p->lchild);
Frond(p->rchild);
}
}
//先序非递归遍历
void _Frond(Node*p)
{
stack<Node*>s;
while(p!=NULL || !s.empty())
{
while(p!=NULL)
{
s.push(p);
cout<<p->data<<" ";
p=p->lchild;
}
if(!s.empty())
{
p= s.top();
s.pop();
p=p->rchild;
}
}
}
//层次遍历
void CenCi(Node*p)
{
if(p==NULL)
{
return;
}
int m = 0;
queue<Node*>s;
int qsize;
s.push(p);
while(!s.empty())
{
m++;
qsize = s.size();//记录当前层次的节点数
int i=0;
while(i<qsize)
{
p=s.front();
if(p->lchild)
{
s.push(p->lchild);
}
if(p->rchild)
{
s.push(p->rchild);
}
cout<<p->data<<" ";
s.pop();
i++;
}
cout<<m<<endl;//显示每一层次的结点
}
}
int main()
{
char *s="fdba$$c$$e$$g$ih$$jp$$$$";
Node*root=CreateTree(s);
Frond(root);
cout<<endl;
_Frond(root);
cout<<endl;
CenCi(root);
cout<<endl;
return 0;
}
二叉树的非递归层次遍历
最新推荐文章于 2022-11-21 10:37:50 发布