【数据结构】 二叉树的简单理解和代码实现

x33g5p2x  于2021-10-01 转载在 其他  
字(2.5k)|赞(0)|评价(0)|浏览(440)

前言:本章主要介绍二叉树的链式结构,及其前序、中序、后序遍历操作,还有 二叉树的其它基本操作包括求结点个数、求叶子结点个数、求第K层结点个数、求二叉树深度等。

二叉树的链式结构

链式结构实现如下:

typedef char BTDataType;
typedef struct BinaryTreeNode
{
	BTDataType data;
	struct BinaryTreeNode* right;
	struct BinaryTreeNode* left;
}BTNode;

二叉树的遍历方式

前序/中序/后续遍历代码实现

上面已经说到,前序遍历方式为根结点—>左子树—>右子树,我们用下图为例

前序遍历代码:

//二叉树前序遍历
void PreOrder(BTNode* root) {
	if (root == NULL) {
		printf("NULL ");
		return;
	}

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

中序遍历代码:

// 二叉树中序遍历
void InOrder(BTNode* root)
{
	if (root == NULL) {
		printf("NULL ");
		return;
	}

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

后序遍历代码如下:

// 二叉树后序遍历
void PostOrder(BTNode* root)
{
	if (root == NULL) {
		printf("NULL ");
		return;
	}

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

二叉树的基本操作

求二叉树结点个数

方法一:用全局遍历

1、全局
int size = 0;//这里不妨思考下能不能直接放入BinaryTreeSize函数内部进行定义
int BinaryTreeSize(BTNode* root)
{
	
	if (root == NULL)
	{
		return;
	}
	else
	{
		++size;
	}

	BinaryTreeSize(root->left);
	BinaryTreeSize(root->right);
}

方法二:局部变量

2、遍历  -- 局部变量
void BinaryTreeSize(BTNode* root, int* psize)
{
	if (root == NULL)
		return;
	else
		++(*psize);

	BinaryTreeSize(root->left, psize);
	BinaryTreeSize(root->right, psize);
}

方法三:

用递归的思想分治,计算二叉树的结点数量,可以认为 数量 = 1 + 左子树数量 + 右子树数量,其中1是当前根结点数量

//3、分治,不再遍历
int BinaryTreeSize(BTNode* root)
{
	return root == NULL ? 0 : 1
		+ BinaryTreeSize(root->left)
		+ BinaryTreeSize(root->right);
}

求二叉树叶子结点个数

按照递归思想,计算二叉树的叶子结点数量,我们可以认为数量等于 = 0 + 左子树叶子结点数量 + 右子树叶子结点数量,0是因为当前根结点有子树,说明根结点不是叶子结点.

//求叶子节点个数
int BinaryTreeLeafSize(BTNode* root)
{
	if (root == NULL)
	{
		return 0;
	}
	else if (root->left == NULL && root->right == NULL)
	{
		return 1;
	}
	else
	{
		return BinaryTreeLeafSize(root->left) + BinaryTreeLeafSize(root->right);
	}
}

求二叉树第K层结点个数

核心思路:求当前树的第k层=左子树的第k-1层+右子树的第k-1层

//求第k层节点个数
//核心思路:求当前树的第k层=左子树的第k-1层+右子树的第k-1层
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);

}

求二叉树的深度/高度

二叉树的高度等于1 + 左右子树高度的最大值.

//二叉树的深度/高度
int BinaryTreeDepth(BTNode* root)
{
	if (root == NULL)
	{
		return 0;
	}

	int leftDepth = BinaryTreeDepth(root->left);
	int rightDepth = BinaryTreeDepth(root->right);

	return leftDepth > rightDepth ? leftDepth + 1 : rightDepth + 1;
}

查找二叉树中值为x的结点

递归分治,先判断当前结点是否是目标,然后查找左子树,再查找右子树.

如果左右子树都没有找到,就返回NULL

BTNode* BinaryTreeFind(BTNode* root, BTDataType x)
{
	if (root == NULL)
		return NULL;
	
	if (root->data == x)
		return root;

	BTNode* retLeft = BinaryTreeFind(root->left, x);
	if (retLeft)
	{
		return retLeft;
	}
	
	BTNode* retRight = BinaryTreeFind(root->right, x);
	if (retRight)
	{
		return retRight;
	}

	return NULL;
}

二叉树源代码

二叉树源代码

相关文章