数据结构——二叉树

目录

前言

一、二叉树的基本概念

二、二叉树的基本操作

1.通过前序遍历的数组"ABD##E#H##CF##G##"构建二叉树

2.二叉树销毁

3.二叉树节点个数

4.二叉树叶子节点个数

5.二叉树第k层节点个数

6.二叉树查找值为x的节点

7.遍历操作:对树中的所有节点进行访问。常见的遍历方式有:

前序遍历:根节点 -> 左子树 -> 右子树

中序遍历:左子树 -> 根节点 -> 右子树

后序遍历:左子树 -> 右子树 -> 根节点

层序遍历:逐层从上到下、从左到右遍历节点。

8.判断二叉树是否是完全二叉树

总结


前言

二叉树是一种非常重要的数据结构,广泛应用于计算机科学中,如表达式求值、排序、查找等领域。


一、二叉树的基本概念

二叉树(Binary Tree)是由节点组成的树形结构,其中每个节点最多有两个子节点,分别称为左子节点右子节点。二叉树有以下几种基本类型:

  • 完全二叉树:除最底层外,其他层的节点数都达到最大,且最底层节点都集中在最左边。
  • 满二叉树:每个节点都有两个子节点,且所有叶子节点都在同一层。
  • 平衡二叉树:任何节点的左右子树高度差不超过 1 的二叉树。

二、二叉树的基本操作

在二叉树中,常见的操作包括:

1.通过前序遍历的数组"ABD##E#H##CF##G##"构建二叉树

BTNode* BinaryTreeCreate(BTDataType* a, int n, int* pi)
{
	if (*(a + *pi) == '#')
	{
		(*pi)++;
		return NULL;
	}

	BTNode* root = (BTNode*)malloc(sizeof(BTNode));
	if (root == NULL)
	{
		perror("root");
		return NULL;
	}

	root->data = *(a + *pi);
	(*pi)++;
	root->left = BinaryTreeCreate(a, n, pi);
	root->right = BinaryTreeCreate(a, n, pi);
	
	return root;
}

2.二叉树销毁

void BinaryTreeDestory(BTNode** root)
{
	if (*root == NULL)
	{
		return;
	}
	BinaryTreeDestory(&(*root)->left);
	BinaryTreeDestory(&(*root)->right);

	free(*root);
	*root = NULL;
}

3.二叉树节点个数

int BinaryTreeSize(BTNode* root)
{
	if (root == NULL)
		return 0;
	return BinaryTreeSize(root->left)+ BinaryTreeSize(root->right) + 1;
}

4.二叉树叶子节点个数

int BinaryTreeLeafSize(BTNode* root)
{
	if (root == NULL)
		return 0;

	if (root->left == NULL && root->right == NULL)
	{
		return 1;
	}
	return BinaryTreeLeafSize(root->left)+BinaryTreeLeafSize(root->right);



	return 0;

}

5.二叉树第k层节点个数

int BinaryTreeLevelKSize(BTNode* root, int k)
{
	if (root == NULL)
		return 0;
	if (k == 1)
	{
		return 1;
	}
	return BinaryTreeLevelKSize(root->left, k - 1)
		+ BinaryTreeLevelKSize(root->right, k - 1);

}

6.二叉树查找值为x的节点

BTNode* BinaryTreeFind(BTNode* root, BTDataType x)
{
	if (root == NULL)
		return NULL;
	if (root->data== x)
		return root;
	BTNode* ret = BinaryTreeFind(root->left, x);
	if (ret!=NULL && ret->data == x)
	{
		return ret;
	}
	ret = BinaryTreeFind(root->right, x);
	if (ret != NULL && ret->data == x)
	{
		return ret;
	}

	return NULL;

}

7.遍历操作:对树中的所有节点进行访问。常见的遍历方式有:

前序遍历:根节点 -> 左子树 -> 右子树

void BinaryTreePrevOrder(BTNode* root)
{
	if (root == NULL)
	{
		printf("NULL ");
		return;
	}

	printf("%c ", root->data);
	BinaryTreePrevOrder(root->left);
	BinaryTreePrevOrder(root->right);
}

中序遍历:左子树 -> 根节点 -> 右子树

  • void BinaryTreeInOrder(BTNode* root)
    {
    	if (root == NULL)
    	{
    		printf("NULL ");
    		return;
    	}
    	BinaryTreePrevOrder(root->left);
    	printf("%c ", root->data);
    	BinaryTreePrevOrder(root->right);
    }

后序遍历:左子树 -> 右子树 -> 根节点

void BinaryTreePostOrder(BTNode* root)
{
	if (root == NULL)
	{
		printf("NULL ");
		return;
	}
	BinaryTreePrevOrder(root->left);
	BinaryTreePrevOrder(root->right);
	printf("%c ", root->data);
}

层序遍历:逐层从上到下、从左到右遍历节点。

void BinaryTreeLevelOrder(BTNode* root)
{
	Que q;
	QueueInit(&q);
	if (root)
		QueuePush(&q, root);

	while (!QueueEmpty(&q))
	{
		BTNode* front = QueueTop(&q);
		QueuePop(&q);
		printf("%c ", front->data);
		if(front->left)
			QueuePush(&q, front->left);
		if (front->right)
			QueuePush(&q, front->right);
	}
	QueueDestroy(&q);
}

8.判断二叉树是否是完全二叉树

int BinaryTreeComplete(BTNode* root)
{
	Que q;
	QueueInit(&q);
	if(root)
		QueuePush(&q,root);

	while (!QueueEmpty(&q))
	{
		BTNode* front = QueueTop(&q);
		QueuePop(&q);
		if(front != NULL)
		{
		QueuePush(&q, front->left);
		QueuePush(&q, front->right);
		}
		else
		{
			break;
		}
		
	}

	while (!QueueEmpty(&q))
	{
		BTNode* front = QueueTop(&q);
		if (front == NULL)
		{
			QueuePop(&q);

		}
		else
		{
			QueueDestroy(&q);
			return 1;
		}
	}
	QueueDestroy(&q);
	return 0;
}

总结


二叉树是一种高效且常用的数据结构,它能够快速查找、插入和删除元素。通过 C 语言实现二叉树操作,能够帮助我们深入理解树形结构的运作原理,并为解决复杂问题提供有力支持。本文介绍了二叉树的基本操作和实现方式,读者可以在此基础上扩展更多功能,如平衡树的实现、树的可视化等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值