前言:本章主要介绍二叉树的链式结构,及其前序、中序、后序遍历操作,还有 二叉树的其它基本操作包括求结点个数、求叶子结点个数、求第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-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;
}
递归分治,先判断当前结点是否是目标,然后查找左子树,再查找右子树.
如果左右子树都没有找到,就返回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;
}
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/weixin_48953972/article/details/120573461
内容来源于网络,如有侵权,请联系作者删除!