#include<iostream>
#include<stdlib.h>
#include<stdio.h>
using namespace std;
#define OK 1
#define ERROR 0
#define OVERFLOW 0
#define TRUE 1
#define FALSE 0
typedef char TElemType;
typedef int Status;
typedef struct BiTNode
{
TElemType data;
struct BiTNode *lchild,*rchild;
} BiTNode,*BiTree;
typedef BiTree ElemType;
typedef struct QNode
{
ElemType data;
struct QNode *next;
} QNode,*QueuePtr;
typedef struct
{
QueuePtr qFront;
QueuePtr qRear;
} LinkQueue;
int init_queue(LinkQueue &lq)
{
lq.qFront = lq.qRear = (QueuePtr)malloc(sizeof(QNode));
if(!lq.qFront)
{
exit(OVERFLOW);
}
return OK;
}
//入队
int en_queue(LinkQueue &lq,ElemType e)
{
QueuePtr p = (QueuePtr)malloc(sizeof(QNode));
if(!p)
{
exit(OVERFLOW);
}
p->data = e;
p->next = NULL;
lq.qRear->next = p;
lq.qRear = p;
return OK;
}
//出队
int de_queue(LinkQueue &lq,ElemType &e)
{
if(lq.qFront == lq.qRear)
{
return ERROR;
}
QueuePtr p = lq.qFront->next;
e = p->data;
lq.qFront->next = p->next;
if(lq.qRear == p)
{
lq.qRear = lq.qFront;
}
free(p);
return OK;
}
//创建二叉树
Status CreateBiTree(BiTree &T)
{
TElemType ch;
if((ch =cin.get()) == '#')
{
//cout<<ch;
T = NULL;
}
else
{
if(T = new BiTNode)
{
T->data = ch;
//cout<<ch;
CreateBiTree(T ->lchild);
CreateBiTree(T ->rchild);
}
else
{
return ERROR;
}
}
return OK;
}
//遍历输出
Status Visit(TElemType e)
{
if(e =='#')
{
return ERROR;
}
cout<<e;
return OK;
}
//前序遍历
Status PreOrderTraverse(BiTree T,Status (*Visit)(TElemType e))
{
if(T)
{
if((Visit(T->data)))
{
PreOrderTraverse(T->lchild,Visit);
PreOrderTraverse(T->rchild,Visit);
}
}
return OK;
}
//中序遍历
Status InOrderTraverse(BiTree T,Status (*Visit)(TElemType e))
{
if(T)
{
InOrderTraverse(T->lchild,Visit);
Visit(T->data);
InOrderTraverse(T->rchild,Visit);
}
return OK;
}
//后序遍历
Status PostOrderTraverse(BiTree T,Status (*Visit)(TElemType e))
{
if(T)
{
PostOrderTraverse(T->lchild,Visit);
PostOrderTraverse(T->rchild,Visit);
Visit(T->data);
}
return OK;
}
//层序遍历
void LevelOrderTraverse(BiTree T,Status(*Visit)(TElemType e))
{
//Visit是对节点操作的应用函数,
//在这里,对每个数据元素调用函数Visit,也即是遍历了该节点
LinkQueue lq;
init_queue(lq);
BiTree p;
if(T)
{
en_queue(lq,T);
while(lq.qFront!=lq.qRear)
{
de_queue(lq,p);
Visit(p->data);
if(p->lchild!=NULL) en_queue(lq,p->lchild);
if(p->rchild!=NULL) en_queue(lq,p->rchild);
}
cout<<endl;
}
}
//获取二叉树高度
Status GetHeight(BiTree T)
{
if(T == NULL)
{
return ERROR;
}
int l = GetHeight(T->lchild);
int r = GetHeight(T->rchild);
return (l>r?l:r)+1;
}
//获取叶子个数
Status GetLeavesNum(BiTree T)
{
if(T == NULL)
{
return 0;
}
if(T->lchild == NULL&&T->rchild == NULL)
{
return 1;
}
return GetLeavesNum(T->lchild)+GetLeavesNum(T->rchild);
}
int main()
{
cout<<"空结点使用符号'#'代替"<<endl;
BiTree T ;
CreateBiTree(T);
cout<<endl<<"前序遍历:";
PreOrderTraverse(T,Visit);
cout<<endl;
cout<<"中序遍历:";
InOrderTraverse(T,Visit);
cout<<endl;
cout<<"后序遍历:";
PostOrderTraverse(T,Visit);
cout<<endl;
cout<<"层序遍历:";
LevelOrderTraverse(T,Visit);
cout<<endl<<"高度:"<<GetHeight(T)<<endl<<"叶子数:"<<GetLeavesNum(T)<<endl;
return 0;
}
数据结构 二叉树实现
最新推荐文章于 2022-05-27 19:15:51 发布