哈喽,大家好,我是小林。今天给大家分享一下对二叉树的一些常规操作。
愿我们都能保持一颗向上的心。
一、前序遍历
//前序遍历
void PreOrder(BTNode* root)
{
//如果根为NULL,直接返回
if (root == NULL)
{
//printf("NULL "); //可打印可不打印
return;
}
//前序遍历,先打印根
printf("%c ", root->val);
//遍历左孩子
PreOrder(root->left);
//遍历右孩子
PreOrder(root->right);
}
二、中序遍历
//中序遍历
void InOrder(BTNode* BT)
{
if (BT == NULL)
{
//printf("NULL "); //可打印可不打印
return;
}
//先遍历左孩子
InOrder(BT->left);
//打印根
printf("%c ", BT->val);
//遍历右孩子
InOrder(BT->right);
}
三、后序遍历
//后序遍历
void PostOrder(BTNode* BT)
{
if (BT == NULL)
{
//printf("NULL "); //可打印可不打印
return;
}
//先遍历左孩子
PostOrder(BT->left);
//再遍历右孩子
PostOrder(BT->right);
//打印根
printf("%c ", BT->val);
}
四、 统计节点个数
//统计个数
size_t BinaryTreeSize(BTNode* BT)
{
//如果BT是NULL,则说明不是节点,所以返回0,节点就+1
return BT == NULL ? 0 : 1 + BinaryTreeSize(BT->left) + BinaryTreeSize(BT->right);
}
五、统计叶子节点个数
//统计叶子个数
size_t BinaryLeafSize(BTNode* root)
{
//根为空,返回0
if (root == NULL)
return 0;
//左孩子和右孩子都为空,是叶子节点,返回1
if (root->left == NULL && root->right == NULL)
return 1;
//递归遍历
return BinaryLeafSize(root->left) +
BinaryLeafSize(root->right);
}
六、第K层的节点个数
//第K层的节点个数
size_t BinaryLevelKSize(BTNode* root, int k)
{
//根为空,返回0
if (root == NULL)
return 0;
//如果k等于1,说明在第k层,返回1
if (k == 1)
return 1;
return BinaryLevelKSize(root->left, k - 1) +
BinaryLevelKSize(root->right, k - 1);
}
七、二叉树的深度
//二叉树的深度
int BinaryTreeDepth(BTNode* root)
{
//根为空,返回0
if (root == NULL)
return 0;
//接收左孩子的深度
int leftRet = BinaryTreeDepth(root->left);
//接收右孩子深度
int rightRet = BinaryTreeDepth(root->right);
//返回左右孩子较大的那一个
return leftRet < rightRet ? rightRet + 1 : leftRet + 1;
}
八、查找值为x的节点
//查找值为x的节点
BTNode* BinaryTreeFind(BTNode* root, BTDataType x)
{
//根为空,返回NULL
if (root == NULL)
return NULL;
//root的值等于val,返回root
if (root->val == x)
return root;
//遍历左孩子找x
BTNode* left = BinaryTreeFind(root->left, x);
//如果值等于x,返回当前节点
if (left->val == x)
return left;
//遍历右孩子找x
BTNode* right = BinaryTreeFind(root->right, x);
//如果值等于x,返回当前节点
if (right->val == x)
return right;
//左右孩子都没找到,返回null
return NULL;
}
九、层序遍历
层序遍历需要用到队列,如果不知道队列的朋友可以看看我分享的这篇文章队列的实现,队列的实现链接git链接。只需要把.h和.c文件拿过来用并修改一下队列存放的数据类型即可使用。
//层序遍历
void LevelOrder(BTNode* root)
{
//如果root