#include<iostream>
#include<stdlib.h>
#define MAX 100
/*
·先序遍历,中序遍历,后序遍历的递归算法及其类似 ,只是其输出语句的位置不同
·层次遍历需要用到队列
·先序遍历,中序遍历,后序遍历的非递归算法需要用到栈
·先序遍历非递归 顺便计算叶子结点
*/
using namespace std;
int count=0;//用来计算叶子结点数
char a[100];//用来存储叶子结点
typedef struct node
{
struct node *lchild;
struct node *rchild;
char data;
}BiTreeNode, *BiTree;
typedef struct{ //队列
BiTree *base;
int front;
int rear;
}SqQueue;
void Init_Queue(SqQueue &s){ //初始化队列
s.base=(BiTree)malloc(MAX*sizeof(BiTreeNode));
s.front=0;s.rear=0;
}
void In_Queue(SqQueue &s,BiTree T){//进队
s.base[s.rear]=T;
s.rear++;
}
void Out_Queue(SqQueue &s){//出队
while(s.front!=s.rear){//队列不为空
cout<<s.base[s.front]->data<<" ";
s.front++;
}
}
void level_Order(SqQueue &s,BiTree T){
if(T){
In_Queue(s,T);//树根进队
}
int k=s.front;
while(k!=s.rear){
if(s.base[k]->lchild!=NULL)//左孩子不是NULL,左孩子进队
In_Queue(s,(s.base[k])->lchild);
if(s.base[k]->rchild!=NULL)//右孩子不是NULL,右孩子进队
In_Queue(s,s.base[k]->rchild);
k++;
}
Out_Queue(s);//输出队列中的值
}
void createBiTree(BiTree &T)
{
char c;
cin >> c;
if('#'== c)
T = NULL;
else
{
T = new BiTreeNode;
if(!T) exit(1);//存储空间分配失败
T->data=c;
createBiTree(T->lchild);
createBiTree(T->rchild);
}
}
void preorder(BiTree T)//先序遍历非递归
{
if(T)
{
cout<<T->data<<" ";
preorder(T->lchild);
preorder(T->rchild);
if(T->lchild==NULL&&T->rchild==NULL){//存储并计算叶子结点
a[count]=T->data;
count++;
}
}
}
void midorder(BiTree T)//中序遍历非递归
{
if(T)
{
midorder(T->lchild);
cout<<T->data<<" ";
midorder(T->rchild);
}
}
void postorder(BiTree T)//后序遍历非递归
{
if(T)
{
postorder(T->lchild);
postorder(T->rchild);
cout<<T->data<<" ";
}
}
int main()
{
BiTree T;
createBiTree(T);
SqQueue s;
Init_Queue(s);
cout<<"二叉树创建完成!"<<endl;
cout<<"前序遍历二叉树:"<<endl;
preorder(T);
cout<<endl;
cout<<"中序遍历二叉树:"<<endl;
midorder(T);
cout<<endl;
cout<<"后序遍历二叉树:"<<endl;
postorder(T);
cout<<endl;
cout<<"叶子节点总数为:"<<count<<endl;
cout<<"叶子节点有:"<<endl;
for(int i =0;i<count;i++)
cout<<a[i]<<" ";
cout<<endl;
cout<<"层次遍历二叉树:"<<endl;
level_Order(s,T);
return 0;
}
二叉树的遍历(一)
最新推荐文章于 2023-07-12 17:34:57 发布