代码实现:
#include<stdio.h>
#include<stdlib.h>
#define ElemType int
typedef struct BiTNode{
ElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
void Locate(BiTNode* &t,BiTNode* &k) //根据实际定义的规则将新加入的节点安放在二叉树中的位置
{ //我自定义的规则是:小于等于父结点的数就做左孩子,否则就做右孩子
while(1)
{
if(t->data>=k->data)
{
if(t->lchild)t=t->lchild;
else{
t->lchild=k;
return;
}
}
if(t->data<k->data)
{
if(t->rchild)t=t->rchild;
else{
t->rchild=k;
return;
}
}
}
}
void BuildTree(BiTree &T) //用用户输入的序列构造二叉树
{
int a;
T=NULL;
T=(BiTree)malloc(sizeof(BiTNode));
T->data=-999;
BiTNode *t=T;
T->lchild=NULL;
T->rchild=NULL;
scanf("%d",&a);
while(a!=9999)
{
if(T->data==-999)T->data=a;
else{
BiTNode* k=(BiTNode*)malloc(sizeof(BiTNode));
k->data=a;
k->lchild=NULL;
k->rchild=NULL;
Locate(t,k); //根据实际定义的规则将新加入的节点安放在二叉树中的位置
}
t=T;
scanf("%d",&a);
}
}
void Visit(BiTNode* T)
{
printf("%d ",T->data);
}
void PreOrder(BiTree T)
{
if(T)
{
Visit(T);
PreOrder(T->lchild);
PreOrder(T->rchild);
}
return;
}
void InOrder(BiTree T)
{
if(T)
{
InOrder(T->lchild);
Visit(T);
InOrder(T->rchild);
}
return;
}
void PostOrder(BiTree T)
{
if(T)
{
PostOrder(T->lchild);
PostOrder(T->rchild);
Visit(T);
}
return;
}
typedef struct Node{
BiTNode* data;
struct Node* next;
}Node; //定义队列结点
typedef struct LinkQueue{
Node *head,*rail;
}LinkQueue; //定义队列结点
void EnQueue(LinkQueue &L,BiTNode* t) //链队列入队
{
Node *p=(Node*)malloc(sizeof(Node));
p->data=t;
p->next=NULL;
if(L.head==NULL&&L.rail==NULL)
{
L.rail=p;
L.head=L.rail;
}
else
{
L.rail->next=p;
L.rail=p;
}
}
bool DeQueue(LinkQueue &L,BiTNode* &t) //链队列出队
{
if(L.head==NULL&&L.rail==NULL)return false;
Node *p=L.head;
t=p->data;
if(p==L.rail)
{
L.head=NULL;
L.rail=NULL;
}
else
{
L.head=p->next;
}
free(p);
return true;
}
bool QueueEmpty(LinkQueue L)
{
if(L.head==NULL&&L.rail==NULL)return true;
else return false;
}
void LevelOrder(BiTree T)
{
LinkQueue L; //定义用来存储结点指针的队列
L.head=L.rail=NULL;
if(T)Visit(T);
else printf("\n树为空!!\n");
if(T->lchild)EnQueue(L,T->lchild);
if(T->rchild)EnQueue(L,T->rchild);
while(!QueueEmpty(L))
{
BiTNode* q;
DeQueue(L,q);
Visit(q);
if(q->lchild)EnQueue(L,q->lchild);
if(q->rchild)EnQueue(L,q->rchild);
}
printf("\n");
}
int TreeDepth(BiTree T) //测量二叉树的高度
{
if(T==NULL)return 0;
else{
int l=TreeDepth(T->lchild);
int r=TreeDepth(T->rchild);
return (l+1)>(r+1)?(l+1):(r+1);
}
}
void DestroyTree(BiTree &T) //二叉树销毁算法
{
if(T!=NULL)
{
DestroyTree(T->lchild);
DestroyTree(T->rchild);
free(T);
}
else return;
}
int main()
{
BiTree T; //定义一棵空树
printf("\n请输入构造序列:\n");
BuildTree(T); //用用户输入的序列构造二叉树
printf("\n输出先序遍历结果:\n");
PreOrder(T); //先序遍历
printf("\n\n输出中序遍历结果:\n");
InOrder(T); //中序遍历
printf("\n\n输出后序遍历结果:\n");
PostOrder(T); //后序遍历
printf("\n\n输出层序遍历结果:\n");
LevelOrder(T); //层序遍历
printf("\n\n此二叉树高度为: %d\n",TreeDepth(T));
DestroyTree(T); //二叉树的销毁
printf("\n销毁成功!\n");
}
运行结果: