二叉树(链式结构存储)

二叉树(链式结构存储)_第1张图片

个人名片:

作者简介:一名乐于分享在学习道路上收获的大二在校生
‍❄个人主页:GOTXX
个人WeChat:ILXOXVJE

本文由GOTXX原创,首发CSDN
系列专栏:零基础学习C语言----- 数据结构的学习之路
每日一句:如果没有特别幸运,那就请特别努力!
————————————————

文章简介:

本篇文章是   上一篇文章续写,主要写了二叉树链式结构以及相关函数代码的实现,包括了二叉树的前,中,后序遍历,层序遍历等的相关知识详细讲解!

如果您觉得文章不错,期待你的一键三连哦,你的鼓励是我创作动力的源泉,让我们一起加油,一起奔跑,让我们顶峰相见!!!

1.二叉树的前,中,后序

二叉树(链式结构存储)_第2张图片

前序:按照访问顺序依次访问根,左子树,右子树

中序:按照访问顺序依次访问左子树,根,右子树

后序:按照访问顺序依次访问左子树,右子树,根

层序:一层一层的挨着遍历;

 以上图为例:(N 表示NULL)

前序:1     2     4     N      N     5     N      N     3      6      N     N    7    N     N 

中序:N    4     N     2      N      5     N     1      N      6     N     3     N    7     N

后序:N    N     4     N     N      5     2      N      N     6      N     N    7     3     1

层序:1     2     3     4      5      6      7

2.二叉树的前,中,后序遍历代码实现(递归)

前序遍历代码:

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

	printf("%d ",root->val);
	PrevPrintf(root->left);
	PrevPrintf(root->right);

}

中序遍历代码:

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

	InPrintf(root->left);
	printf("%d ", root->val);
	InPrintf(root->right);

}

后序遍历代码:

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

	PostPrintf(root->left);
	PostPrintf(root->right);
	printf("%d ", root->val);

}

2.实现几个函数

1.求树中结点个数

int    TreeSize(BTNode*  root);

代码思想:

要求树的结点,可以先求左右子树结点相加,求左右子树结点又可以先求左右子树的左右子树的结点相加;

实现代码:
​
//结点的个数
int TreeSize(BTNode* root)
{
	if (root == NULL)
		return 0;

	return TreeSize(root->left) + TreeSize(root->right) + 1;
}

​

2.求树中叶子结点的个数

int    TreeLeafSize(BTNode*  root);

代码思想:

叶子结点的特点是:左右子树都为NULL;

当根结点为NULL时,直接返回0;

当左右子树都为NULL时,返回1,

不满足上面条件就继续递归当前结点的左右子树;

实现代码:
// 叶子节点个数
int TreeLeafSize(BTNode* root)
{
	if (root == NULL)
		return 0;
	if (root->left == NULL && root->right == NULL)
		return 1;

	return TreeLeafSize(root->left)+TreeLeafSize(root->right);
}

3.求树中第k层结点的个数

int    TreeKLevel(BTNode*  root);

代码思想:

对于第一层来说时求第k层的结点个数,但是对于第二层来说是求第k-1层的节点个数,对于第二层来说求第k-层的结点数目,以此类推,对于k-1层来说是求第二层结点数;

实现代码:
//第k层的结点
int TreeKLevel(BTNode* root, int k)
{
	assert(k > 0);

	if (root == NULL)
		return 0;

	if (k == 1)
		return 1;

	return TreeKLevel(root->left, k - 1) + TreeKLevel(root->right, k - 1);

}

4.查找树中的值

BTNode*  TreeFind(BTNode* root)

代码思想:

先与根比较,不是根再到左子树去找,左子树没有找到再到右子树中找

 代码实现:
BTNode* FindBinaryTreeX(BTNode* root, int x)
{
	if (root == NULL)
		return;
	if (root->val == x)
		return root;

	BTNode* ret = NULL;
	ret = FindBinaryTreeX(root->left, x);

//如果ret不为空,就说明找到了,直接返回,不用到另一边去找
	if (ret)
		return ret;

	ret = FindBinaryTreeX(root->right, x);
	if (ret)
		return ret;

//找完了,没找到,返回空
	return NULL;
}

5.二叉树的层序遍历

void  BinaryTreeLevelOrder(BTNode* root)

代码思想:

利用队列先进先出的特点,先将根结点入进去,取出队列最前面的数,进行打印,再将根结点Pop出队列时,再将该结点的左右子树入进去,如图解:

二叉树(链式结构存储)_第3张图片

 

代码实现:
void BinaryTreeLevelOrder(BTNode* root)
{
	Qu1 p;

//队列的初始化
	QueueInit(&p);
//如果根结点不为空,将根入队列
	if (root)
		QueuePush(&p, root);

	while (!QueueEmpty(&p))
	{
		BTNode* front = QueueFront(&p);
		QueuePop(&p);
		printf("%d ",front->val);
		if(front->left!=NULL)
			QueuePush(&p, front->left);
		if (front->right!= NULL)
			QueuePush(&p, front->right);
	}
//队列的销毁
	QueueDestory(&p);
}

6.二叉树的销毁

void BinaryTreeDestory(BTNode** root)

代码实现
// 二叉树销毁
void BinaryTreeDestory(BTNode* root)
{
	if (root == NULL)
		return;

	BinaryTreeDestory(root->left);
	BinaryTreeDestory(root->right);
	free(root);

	//这里root是形参,对它改变不会改变实参;
	root = NULL;
}

你可能感兴趣的:(数据结构的学习之路,算法,数据结构,c语言)