二叉树的程序实现



//先序遍历
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;
}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值