C语言二叉树的实现

        二叉树的储存结构包含顺序存储结构和链式存储结构,由于顺序存储结构很容易造成不必要的浪费,本人用的是链式存储结构(注意在实际操作中最后 要释放节点空间)。基本操作包括:遍历二叉树、先序遍历的顺序建立二叉树、复制二叉树、计算二叉树深度、计算二叉树结点个数。下面讲一下实现代码:

        首先是定义结构类型:

typedef struct BiTNode{
	ElemType data;
	BiTNode *lchild;
	BiTNode *rchild;
}BiTNode,*BiTree;

        遍历二叉树:

void InOrderTraverse(BiTree T)
{
	if (T)
	{
		InOrderTraverse(T->lchild);
		printf("%c ", T->data);
		InOrderTraverse(T->rchild);
	}
}

        判断T是否为空,如果T不为空树,则递归读取左子树,输出当前根节点的数据,递归读取右子树。

序遍历的顺序建立二叉树:

BiTNode *CreateBiTree(BiTree T)
{
	ElemType ch;
	scanf("%c", &ch);
	if (ch == '#')
		T = NULL;
	else
	{
		T = (BiTNode *)malloc(sizeof(BiTNode));
		T->data = ch;
		T->lchild = CreateBiTree(T->lchild);
		T->rchild = CreateBiTree(T->rchild);
	}
	return T;
}

        该函数将#作为空的标志,当输入的字符为#的时候,T为空树。如果不为空,先为T动态分配BiTNode类型的空间,将输入字符的值赋值给树T的数据域,递归调用CreateBiTree()来输入T的左右子树的数据。注意必须返回T的地址。

复制二叉树:

BiTNode *Copy(BiTree T, BiTree NewT)
{
	if (T == NULL)
		NewT = NULL;
	else
	{
		NewT = (BiTNode *)malloc(sizeof(BiTNode));
		NewT->data = T->data;
		NewT->lchild = Copy(T->lchild, NewT->lchild);
		NewT->rchild = Copy(T->rchild, NewT->rchild);
	}
	return NewT;
}

        复制和创建个人觉得逻辑上是差不多的,只是将旧树T的data赋值给新树NewT的data,然后递归实现对左右子树的复制。

        求二叉树树的深度:

int Depth(BiTree T)
{
	int m, n;
	if (T == NULL)
		return 0;
	else
	{
		m = Depth(T->lchild);
		n = Depth(T->rchild);
		if (m > n)
			return (m + 1);
		else
			return (n + 1);
	}
}

        先判断数是否为空,如果为空,深度为0,则返回0。如果不为空,让m等于左子树的深度,n等于右子树的深度,如果大于n则返回m+1(子树的深度加上当前根等于树的深度),否则返回n+1。

        求节点数:

int NodeCount(BiTree T)
{
	if (T == NULL)
		return 0;
	else
		return NodeCount(T->lchild) + NodeCount(T->rchild) + 1;
}

        判断T是否为空树,如果是的话,返回0,此时节点数为0个。如果不是,返回T的左子树节点数、右子树节点数、当前节点的和,得到所有节点的数量。

        加入main():

int main(void)
{
         BiTree T, NewT;
         int n, dep, num;
         T = NULL;
         NewT = NULL;
         printf("1.遍历二叉树\n2.建立二叉树\n3.复制二叉树\n4.计算二叉树的深度\n5.计算节点的个数\n6.退出\n");
         while (1)
         {
                   printf("请选择:");
                   scanf("%d",&n);
                   switch (n)
                   {
                   case 1:
                            InOrderTraverse(T);
                            printf("\n");
                            break;
                   case 2:
                            fflush(stdin);
                            T = CreateBiTree(T);
                            break;
                   case 3:
                            NewT = Copy(T,NewT);
                            InOrderTraverse(NewT);
                            printf("\n");
                            break;
                   case 4:
                            dep = Depth(T);
                            printf("深度为:%d\n",dep);
                            break;
                   case 5:
                            num = NodeCount(T);
                            printf("节点数为:%d\n",num);
                            break;
                   case 6:
                            exit(0);
                   }
         }
         return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值