数据结构初阶|【数据结构】 二叉树的简单理解和代码实现
前言:本章主要介绍二叉树的链式结构,及其前序、中序、后序遍历操作,还有 二叉树的其它基本操作包括求结点个数、求叶子结点个数、求第K层结点个数、求二叉树深度等。
文章目录
- 二叉树的链式结构
-
- 二叉树的遍历方式
-
- 前序/中序/后续遍历代码实现
- 二叉树的基本操作
-
-
- 求二叉树结点个数
- 求二叉树叶子结点个数
- 求二叉树第K层结点个数
- 求二叉树的深度/高度
- 查找二叉树中值为x的结点
-
- 二叉树源代码
二叉树的链式结构 链式结构实现如下:
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 =https://www.it610.com/article/= 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;
}
二叉树源代码 二叉树源代码
【数据结构初阶|【数据结构】 二叉树的简单理解和代码实现】数据结构的二叉树内容到此介绍结束了,感谢您的阅读!!!如果内容对你有帮助的话,记得给我三连(点赞、收藏、关注)——做个手有余香的人。
推荐阅读
- 宽容谁
- 我要做大厨
- 增长黑客的海盗法则
- 画画吗()
- 2019-02-13——今天谈梦想()
- 远去的风筝
- 三十年后的广场舞大爷
- 叙述作文
- 20190302|20190302 复盘翻盘
- 学无止境,人生还很长