层次关系结构-----树----二叉树

//二叉树操作
//BinTree.h
//定义链式结构
#include<stdio.h>
#include<stdlib.h>
#define QUEUE_MAXSIZE 
typedef char DATA;           //定义元素类型
typedef struct ChainTree
{
    DATA data;             //元素数据
	struct ChainTree *left;   //左子树结点指针
	struct ChainTree *right;   //右子树结点指针
}ChainBinTree;
//初始化二叉树
ChainBinTree *BinTreeInit(ChainBinTree *node)  //初始化二叉树根节点
{
    if(node!=NULL)  //若二叉树根节点不为空
	    return node;
	else
	    return NULL;
}
//添加数据到二叉树,首先使用BinTreeInit()函数创建二叉树根节点,然后使用BinTreeAddNode()添加结点到二叉树
//添加数据到二叉树,bt为父结点,node为子结点,n=表示添加左子树,n=2表示添加右子树
int BinTreeAddNode(ChainBinTree *bt,ChainBinTree *node,int n)
{
     if(bt==NULL)
	 {
	       printf("父结点不存在,请先设置父结点!\n");
		   return 0;
	 }
	 switch(n)
	 {
	        case 1:         //添加到左结点
			if(bt->left)   //左子树不为空
			 {
			     printf("左子树不为空!\n");
				 return 0;
			 }
			 else
			     bt->left=node;
			break;
			case 2:   //添加到右结点
			if(bt->right)   //右子树不为空
			{
			      printf("右子树结点不为空!\n");
				  return 0;
			}
			else
			   bt->right=node;
			break;
			default:
			      printf("参数错误!\n");
				  return 0;	
	 }
	 return 1;
}
//分别获取二叉树的左右子树
ChainBinTree *BinTreeLeft(ChainBinTree *bt)   //返回左子结点
{
     if(bt)
	     return bt->left;
      else
	     return NULL;
}
ChainBinTree *BinTreeRight(ChainBinTree *bt) //返回右子结点
{
    if(bt)
	   return bt->right;
	else
	   return NULL;
}
//获取二叉树的状态,即判断二叉树是否为空和计算深度
int BinTreeIsEmpty(ChainBinTree *bt) //检查二叉树是否为空,为空则返回1,否则返回0
{
   if(bt)
      return 0;
	else
	  return 1;
}
int BinTreeDepth(ChainBinTree *bt)  //求二叉树深度
{
   int dep1,dep2;
   if(bt==NULL)
      return 0;
	else
	{
	  dep1=BinTreeDepth(bt->left);       //左子树深度(递归调用)
	  dep2=BinTreeDepth(bt->right);      //右子树深度(递归调用)
	  if(dep1>dep2)
	      return dep1+1;
		else
		  return dep2+1;
	}
}
/*进行查找操作,即再二叉树中查找数据,此时需要遍历二叉树的所有结点,
逐个比较数据,当找到目标数据时将返回该数据所在结点的指针*/
ChainBinTree *BinTreeFind(ChainBinTree *bt,DATA data)  //在二叉树中查找值为data的结点
{
    ChainBinTree *p;
	if(bt==NULL)
	    return NULL;
	else
	{
	   if(bt->data==data)
	      return bt;
		else    //分别向左右子书递归查找
		{
		     if(p=BinTreeFind(bt->left,data))
			     return p;
			  else if(p=BinTreeFind(bt->right,data))
			    return p;
			 else return NULL;
		}
	}
}
/*清空二叉树
在添加结点时,通过使用malloc()函数来申请分配每个结点的内存,
所以在清空二叉树时必须使用free()函数来释放结点所占内存。
由此可见,清空二叉树的操作就是释放各结点所占内存的操作。*/
void BinTreeClear(ChainBinTree *bt)
{
    if(bt)
	{
	    BinTreeClear(bt->left); //清空左子树
		BinTreeClear(bt->right);  //清空右子树
		free(bt);                //释放当前结点所占内存
		bt=NULL;
	}
	return ;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值