二叉树的操作大全

文章介绍了如何通过前序遍历数组构建二叉树,以及二叉树的前序、中序、后序遍历方法,计算节点总数、第k层节点数、查找特定节点、叶子节点数量,以及销毁二叉树和判断是否为完全二叉树的函数及其在给定测试数据上的应用。
摘要由CSDN通过智能技术生成


1.通过前序遍历数组"ABD##E#H##CF##G##"构建二叉树

BTNode* createNode(BTDataType n)
{
	BTNode* NewNode = (BTNode*)malloc(sizeof(BTNode));
	NewNode->data = n;
	NewNode->left = NULL;
	NewNode->right = NULL;
	return NewNode;
}


// 通过前序遍历的数组"ABD##E#H##CF##G##"构建二叉树
BTNode* BinaryTreeCreate(BTDataType* a, int* pi)
{
	if (a[*pi] == '#')
	{
		(*pi)++;
		return NULL;
	}
	BTNode* root = createNode(a[(*pi)++]);
	root->left = BinaryTreeCreate(a, pi);
	root->right = BinaryTreeCreate(a, pi);
	return root;
}

2.前序遍历

//前序遍历
void BinaryTreePrevOrder(BTNode* root){
	if (root == NULL)
		return;

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

3.中序遍历

//中序
void BinaryTreeInOrder(BTNode* root) {
	if (root == NULL)
		return;

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

4.后序遍历

//后序
void BinaryTreePostOrder(BTNode* root) {
	if (root == NULL)
		return;

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

5.层序遍历

这里需要用到队列来存储结点

//层序遍历
void BinaryTreeLevelOrder(BTNode* root)
{
	Que q;
	QueueInit(&q);

	if (root)
		QueuePush(&q, root);

	while (!QueueEmpty(&q))
	{
		BTNode* front = QueueFront(&q);
		printf("%c ", front->data);
		if (front->left)
			QueuePush(&q, front->left);

		if (front->right)
			QueuePush(&q, front->right);

		QueuePop(&q);
	}
	printf("\n");

	QueueDestroy(&q);
}

6.二叉树结点个数及第k层结点个数

其中第k层结点个数相当于第k减一层的第一层,依次递归

// 二叉树节点个数
int BinaryTreeSize(BTNode* root)
{
	if (root == NULL)
		return 0;
	return 1 + BinaryTreeSize(root->left) + BinaryTreeSize(root->right);
}

// 二叉树第k层节点个数
int BinaryTreeLevelKSize(BTNode* root, int k)
{
	assert(k > 0);
	if (root == NULL)
		return 0;
	if (k == 1)
		return 1;
	return BinaryTreeLevelKSize(root->left, k - 1) + BinaryTreeLevelKSize(root->right, k - 1);

}

7.查找为x的结点

// 二叉树查找值为x的节点
BTNode* BinaryTreeFind(BTNode* root, BTDataType x)
{
	if (root == NULL)
		return NULL;
	if (root->data == x)
		return root;
	BTNode* ans = NULL;
	ans = BinaryTreeFind(root->left, x);
	if (ans)
		return ans;
	ans = BinaryTreeFind(root->right, x);
	if (ans)
		return ans;
	return NULL;
}

8.叶子结点个数

// 二叉树叶子节点个数
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);
}

9.销毁二叉树(二级指针)

//销毁二叉树
void BinaryTreeDestory(BTNode** root)
{
	if (*root == NULL)
		return;
	BinaryTreeDestory(&(*root)->left);
	BinaryTreeDestory(&(*root)->right);
	free(*root);
	*root = NULL;
}

10.判断是否为完全二叉树

// 判断二叉树是否是完全二叉树
bool BinaryTreeComplete(BTNode* root)
{
	Que q;
	QueueInit(&q);

	if (root)
		QueuePush(&q, root);

	while (!QueueEmpty(&q))
	{
		BTNode* front = QueueFront(&q);
		QueuePop(&q);

		if (front != NULL)
		{
			QueueDestroy(&q);
			return false;
		}
	}

	QueueDestroy(&q);
	return true;
}

测试代码及运行结果

#include "tree.h"

int main() {
    BTDataType a[] = { 'A','B','D','#','#','E','#','H','#','#','C','F','#','#','G','#','#' };
    int j = 0;
    int k = 2;
    BTDataType x = 'j';
    BTNode* root = BinaryTreeCreate(a, &j);

    printf("Preorder Traversal of the Binary Tree: ");
    BinaryTreePrevOrder(root);
    printf("\nInorder Traversal of the Binary Tree: ");
    BinaryTreeInOrder(root);
    printf("\nPostorder Traversal of the Binary Tree: ");
    BinaryTreePostOrder(root);
    int ret1 = BinaryTreeSize(root);
    printf("\n节点数为%d\n", ret1);
    int ret2 = BinaryTreeLevelKSize(root, k);
    printf("第k层节点数为%d\n", ret2);
    BTNode* ret3 = BinaryTreeFind(root, x);
    if (ret3 == NULL)
        printf("没找到\n");
    else
        printf("找到了\n");
    int ret4 = BinaryTreeLeafSize(root);
    printf("叶子节点数为%d\n", ret4);
    printf("Levelorder Traversal of the Binary Tree: ");
    BinaryTreeLevelOrder(root);
    int ret5 = BinaryTreeComplete(root);
    printf("\n%d", ret5);
    return 0;
}

在这里插入图片描述

评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

c.night

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值