//先序遍历
void BinTree_LDR_xian(ChainBinTree *bt,void(*oper)(ChainBinTree *p))
{
if(bt) //树不为空,则执行如下操作
{
oper(bt);
BinTree_LDR_xian(bt->left,oper);
BinTree_LDR_xian(bt->right,oper);
}
return ;
}
//中序遍历
void BinTree_LDR_xian(ChainBinTree *bt,void(*oper)(ChainBinTree *p))
{
if(bt) 树不为空,则执行如下操作
{
BinTree_LDR_zhong(bt->left,oper); //中序遍历左子树
oper(bt); //处理数据结点
BinTree_LDR_zhong(bt->right,oper); //中序遍历右子树
}
return ;
}
//后序遍历
void BinTree_LDR_xian(ChainBinTree *bt,void(*oper)(ChainBinTree *p))
{
if(bt) 树不为空,则执行如下操作
{
BinTree_LDR_hou(bt->left,oper); //后序遍历左子树
BinTree_LDR_hou(bt->right,oper); //后序遍历右子树
oper(bt); //处理数据结点
}
return ;
}
//按层遍历
void BinTree_LDR_ceng(ChainBinTree *bt,void(*oper) (ChainBinTree *p))
{
ChainBinTree *p;
ChainBinTree *q[QUEUE_MAXSIZE]; //定义一个顺序栈
int head=0,tail=0; //队首,队尾序号
if(bt)
{
tail=(tail+1)%QUEUE_MAXSIZE; //计算循环队列队尾序号
q[tail]=bt; //将二叉树根指针进队
}
while(head!=tail) //队列不为空,进行循环
{
head=(head+1)%QUEUE_MAXSIZE; //计算循环队列的队首序号
p=q[head]; //获取队首元素
oper(p);
if(p->left!=NULL) //若结点存在左子树,则左子树指针进队
{
tail=(tail+1)%QUEUE_MAXSIZE; //计算循环队列队尾序号
q[tail]=p->left; ///将左子树指针进队
}
if(p->right!=NULL) //若结点存在右子树,则左子树指针进队
{
tail=(tail+1)%QUEUE_MAXSIZE; //计算循环队列队尾序号
q[tail]=p->right; ///将右子树指针进队
}
}
return ;
}
#include<stdio.h>
#include "BinTree.c"
ChainBinTree *InitRoot() //初始化二叉树的根
{
ChainBinTree *node;
if(node=(ChainBinTree *)malloc(sizeof(ChainBinTree))) //分配内存
{
printf("\n输入根结点数据:");
scanf("%s",&node->data);
node->left=NULL;
node->right=NULL;
return node;
}
return NULL;
}
//编写AddNode(),用于向二叉树指定的结点添加子结点
void AddNode(ChainBinTree *bt)
{
ChainBinTree *node,*parent;
DATA data;
char select;
if(node=(ChainBinTree *)malloc(sizeof(ChainBinTree))) //分配内存
{
printf("\n输入二叉树结点数据:");
fflush(stdin); //清空输入缓冲区
scanf("%s",&node->data);
node->left=NULL;
node->right=NULL;
printf("输入父结点数据:");
fflush(stdin); //清空输入缓冲区
scanf("%s",&data);
parent=BinTreeFind(bt,data); //查找指定数据的结点
if(!parent)
{
printf("未找到父结点!\n");
free(node); //释放创建的结点内存
return ;
}
printf("1.添加到左子树\n2.添加到右子树\n");
do{
select=getchar();
select-='0';
if(select==1||select==2)
BinTreeAddNode(parent,node,select);
}while(select!=1&&select!=2);
return ;
}
}
int main()
{
ChainBinTree *root=NULL; //root为指向二叉树根结点的指针
char select;
void (*oper1) (); //指向函数的指针
oper1=oper1; //指向具体操作的函数
do{
printf("\n1.设置二叉树根元素 2.添加二叉树根结点\n");
printf("3.先序遍历 3.中序遍历\n");
printf("5.后序遍历 6.按层遍历\n");
printf("7.二叉树深度 0.退出\n");
select=getchar();
switch(select){
case '1': //设置根元素
root=InitRoot();
break;
case '2':
AddNode(root);
break;
case '3':
printf("\n先序遍历的结果: ");
BinTree_LDR_xian(root,oper1);
printf("\n");
break;
case '4':
printf("\n中序遍历的结果: ");
BinTree_LDR_zhong(root,oper1);
printf("\n");
break;
case '5':
printf("\n后序遍历的结果: ");
BinTree_LDR_hou(root,oper1);
printf("\n");
break;
case '6':
printf("\n按层遍历的结果: ");
BinTree_LDR_ceng(root,oper1);
printf("\n");
break;
case '7':
printf("\n二叉树深度为%d\n",BinTreeDepth(root));
break;
case '0':
break;
}
}while(select!=0);
BinTreeClear(root); //清空二叉树
root=NULL;
getchar();
return 0;
}