二叉树
本篇博客主要是带来二叉树的相关操作的实现,内容很详细。
- 二叉树建立
- 求结点个数
- 求叶子结点个数
- 求第K层结点个数
- 查找值为X的结点
- 前、中、后序遍历
1. 二叉树的建立
// 通过前序遍历的数组"ABD##E#H##CF##G##"构建二叉树
BTNode* BinaryTreeCreate(BTDataType* a, int* pi)
//这里的a是树的所有结点元素的数组,pi是a的下标的地址
//这里是解释[为何下标要传指针](https://blog.csdn.net/weixin_50168448/article/details/112968041)
{
//#表示空节点,空节点不需要开辟空间直接返回
if (a[*pi] == '#')
{
(*pi)++;
return NULL;
}
//前序遍历 先建立根
BTNode *root = malloc(sizeof(BTNode));
root->_val = a[*pi];
(*pi)++;
root->_left = BinaryTreeCreate(a, pi);
root->_right = BinaryTreeCreate(a, pi);
//最后链接起来
return root;
}
2. 求二叉树结点个数
// 二叉树节点个数
int BinaryTreeSize(BTNode* root)
{
//这里使用的是前序遍历
//root是空节点返回0
if (root == NULL)
{
return 0;
}
//root不是空结点,算是一个结点
//返回 1 + 左子树的节点数 + 右子树的节点数
return 1 + BinaryTreeSize(root->_left) + BinaryTreeSize(root->_right);
}
3. 求叶子结点个数
// 二叉树叶子节点个数
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);
}
4. 第K层结点个数
// 二叉树第k层节点个数
//对于第K层结点来讲相当于是第一层结点
int BinaryTreeLevelKSize(BTNode* root, int k)
{
if (root == NULL)
{
return 0;
}
//递归递归出口,k = 1 说明当前层就是 整个二叉树的第 k 层
if (k == 1)
{
return 1;
}
//左右子树的第 K-1 层之和
return BinaryTreeLevelKSize(root->_left,k-1) + BinaryTreeLevelKSize(root->_right, k - 1);
}
5. 查找值为X的节点
// 二叉树查找值为x的节点
BTNode* BinaryTreeFind(BTNode* root, BTDataType x)
{
//前序遍历
if (root == NULL)
{
return NULL;
}
//判断根节点,若是返回根节点
if (root->_val == x)
{
return root;
}
//根节点不是,遍历左子树查找,找到就返回该结点
BTNode *node = BinaryTreeFind(root->_left, x);
if (node != NULL)
{
return node;
}
//左子树没找到遍历右子树找,找到返回该结点
node = BinaryTreeFind(root->_right, x);
if (node != NULL)
{
return node;
}
//右子树也没找到返回NULL
return NULL;
}
6. 前、中、后序遍历
// 二叉树前序遍历
void BinaryTreePrevOrder(BTNode* root)
{
if (root == NULL)
{
return;
}
printf("%c ", root->_val);
BinaryTreePrevOrder(root->_left);
BinaryTreePrevOrder(root->_right);
}
// 二叉树中序遍历
void BinaryTreeInOrder(BTNode* root)
{
if (root == NULL)
{
return;
}
BinaryTreeInOrder(root->_left);
printf("%c ", root->_val);
BinaryTreeInOrder(root->_right);
}
// 二叉树后序遍历
void BinaryTreePostOrder(BTNode* root)
{
if (root == NULL)
{
return;
}
BinaryTreePostOrder(root->_left);
BinaryTreePostOrder(root->_right);
printf("%c ", root->_val);
}