二叉树的基本操作

这篇博客介绍了二叉树的一些基本操作,包括如何初始化和清除二叉树,以及通过先序遍历创建二叉树的函数。还提供了计算二叉树深度和节点数量的方法。
/* 定义DataType为char类型 */
typedef char DataTypec;

/* 二叉树的结点类型 */
typedef struct BitNode
{
DataTypec data;
struct BitNode *lchild,*rchild;
}BitNode,*BitTree;

/* 初始化二叉树,即把树根指针置空 */
void BinTreeInit(BitTree BT);

/* 按先序次序建立一个二叉树*/
void BinTreeCreat(BitTree BT);

/* 检查二叉树是否为空 */
int BinTreeEmpty(BitTree *BT);

/* 按任一种遍历次序(包括按先序、中序、后序、按层次)输出二叉树中的所有结点 */
void CreateBiTree1(BitTree &BT);

/* 求二叉树的深度 */
int BinTreeDepth(BitTree BT);

/* 求二叉树中所有结点数 */
int  BinTreeCount(BitTree BT);

/* 清除二叉树,使之变为空树 */

void BinTreeClear(BitTree BT);

void BinTreeInit(BitTree BT)
{
BT = (BitTree)malloc(sizeof(BitNode));
BT->lchild = BT->rchild = NULL;
}

void BinTreeCreat(BitTree BT)
{
if (BT)
{
printf("%d",BT->data);
BinTreeCreat(BT->lchild);
BinTreeCreat(BT->rchild);
}
}


int BinTreeEmpty(BitTree *BT)
{
if (BT == NULL)
    return 1;
else
    return 0;
}


void CreateBiTree1(BitTree &BT)//先序创建二叉树
{ char ch;
    scanf("%c",ch);
if (ch == '#') BT = NULL;
else{
BT = new BitNode;
BT->data = ch;
CreateBiTree1(BT->lchild);
CreateBiTree1(BT->rchild);
}
}


BitTree BinTreeCreate()
{
BitTree r;
char s;
printf("请输入结点值,在A~Z之间\n");
do{
s = getchar();
} while (s<'A' || s>'Z');
r = (BitTree)malloc(sizeof(BitNode));
r->data = s;
printf("");
do 
{
s = getchar();
} while (s != 'Y'&&s != 'N');
if (s == 'Y')
r->lchild = BinTreeCreate();
return r;
}

int BinTreeDepth(BitTree BT)//树的深度
{
if (BT == NULL)
return 0;
else
{
int m = BinTreeDepth(BT->lchild);
int n = BinTreeDepth(BT->rchild);
if (m > n) return (m + 1);
else return (n + 1);
}
}

int  BinTreeCount(BitTree BT)
{
if (!BT) return 0;
if (!BT->lchild &&!BT->rchild)
return 1;
else
return BinTreeCount(BT->lchild) + BinTreeCount(BT->rchild);
}

void BinTreeClear(BitTree BT)
{
if (BT == NULL)
printf("树为空");
//左右子树找到底,然后返回的时候依次销毁空间
BinTreeClear(BT->lchild);
BinTreeClear(BT->rchild);
free(BT);
BT = NULL;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值