二叉树的实现 c语言

注:层序所需的队列文件请参考 C语言 实现栈(顺序表)和队列(链表)-CSDN博客

一、 BTree.h

函数包含:

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

// 二叉树销毁

// 二叉树节点个数

// 二叉树叶子节点个数

// 二叉树第k层节点个数

// 二叉树查找值为x的节点

// 二叉树前序遍历

// 二叉树中序遍历

// 二叉树后序遍历

// 层序遍历

// 判断二叉树是否是完全二叉树

//求树的高度

函数实现均在BTree.c

#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<assert.h>
#include"Queue.h"


typedef char BTDataType;

typedef struct BinaryTreeNode
{
	BTDataType _data;
	struct BinaryTreeNode* _left;
	struct BinaryTreeNode* _right;
}BTNode;

// 通过前序遍历的数组"ABD##E#H##CF##G##"构建二叉树
BTNode* BinaryTreeCreate(BTDataType* a,  int* pi);
// 二叉树销毁
void BinaryTreeDestory(BTNode** root);
// 二叉树节点个数
int BinaryTreeSize(BTNode* root);
// 二叉树叶子节点个数
int BinaryTreeLeafSize(BTNode* root);
// 二叉树第k层节点个数
int BinaryTreeLevelKSize(BTNode* root, int k);
// 二叉树查找值为x的节点
BTNode* BinaryTreeFind(BTNode* root, BTDataType x);
// 二叉树前序遍历 
void BinaryTreePrevOrder(BTNode* root);
// 二叉树中序遍历
void BinaryTreeInOrder(BTNode* root);
// 二叉树后序遍历
void BinaryTreePostOrder(BTNode* root);
// 层序遍历
void BinaryTreeLevelOrder(BTNode* root);
void BinaryTreeLevelOrder1(BTNode* root);
// 判断二叉树是否是完全二叉树
bool BinaryTreeComplete(BTNode* root);

二、BTree.c

#include"BTree.h"


BTNode* TreePrevOrderBinaryTreeCreate(BTDataType* a, int* pi)
{
	if ('#' == a[*pi])
	{
		(*pi)++;
		return NULL;
	}
	BTNode* root = (BTNode*)malloc(sizeof(BTNode));
	if(NULL == root)
	{
		perror("TreePrevOrderBinaryTreeCreate fail!");
		return NULL;
	}
	root->_data = a[*pi];
	(*pi)++;
	root->_left = TreePrevOrderBinaryTreeCreate(a, pi);
	root->_right = TreePrevOrderBinaryTreeCreate(a, pi);
	return root;
}

// 通过前序遍历的数组"ABD##E#H##CF##G##"构建二叉树
BTNode* BinaryTreeCreate(BTDataType* a, int* pi)
{
	if (NULL == a)
		return NULL;
	return TreePrevOrderBinaryTreeCreate(a,pi);
}
// 二叉树销毁
void BinaryTreeDestory(BTNode** root)
{
	if (NULL == *root)
		return;
	BinaryTreeDestory(&(*root)->_left);
	BinaryTreeDestory(&(*root)->_right);
	free(*root);
}
// 二叉树节点个数
int BinaryTreeSize(BTNode* root)
{
	if (NULL == root)
		return 0;
	return BinaryTreeSize(root->_left) 
		+ BinaryTreeSize(root->_right) + 1;
}
// 二叉树叶子节点个数
int BinaryTreeLeafSize(BTNode* root)
{
	if (NULL == root)
		return 0;
	if (root->_left == NULL && root->_right == NULL)
		return 1;
	return BinaryTreeLeafSize(root->_left)
		+ BinaryTreeLeafSize(root->_right);
}
// 二叉树第k层节点个数
int BinaryTreeLevelKSize(BTNode* root, int k)
{
	assert(k > 0);
	if(NULL == root)
		return 0;
	if (1 == k)
		return 1;
	return BinaryTreeLevelKSize(root->_left, k-1) +			 BinaryTreeLevelKSize(root->_right, k-1);
	
}
// 二叉树查找值为x的节点
BTNode* BinaryTreeFind(BTNode* root, BTDataType x)
{
	if (NULL == root)
		return NULL;
	if (x == root->_data)
	{
		return root;
	}
	BTNode* ret1 = BinaryTreeFind(root->_left, x);
	BTNode* ret2 = BinaryTreeFind(root->_right, x);
	if (ret1 != NULL)
	{
		return ret1;
	}
	if (ret2 != NULL)
	{
		return ret2;
	}
	return NULL;
}
// 二叉树前序遍历 
void BinaryTreePrevOrder(BTNode* root)
{
	if (NULL == root)
		return;
	printf("%c", root->_data);
	BinaryTreePrevOrder(root->_left);
	BinaryTreePrevOrder(root->_right);
}
// 二叉树中序遍历
void BinaryTreeInOrder(BTNode* root)
{
	if (NULL == root)
		return;
	BinaryTreeInOrder(root->_left);
	printf("%c", root->_data);
	BinaryTreeInOrder(root->_right);
}
// 二叉树后序遍历
void BinaryTreePostOrder(BTNode* root)
{
	if (NULL == root)
		return;
	BinaryTreePostOrder(root->_left);
	BinaryTreePostOrder(root->_right);
	printf("%c", root->_data);
}
// 层序遍历
//需要用到队列,字符
void BinaryTreeLevelOrder(BTNode* root)
{
	if (NULL == root)
		return;
	Queue q;
	QueueInit(&q);
	QueuePush(&q, root);
	while (!QueueEmpty(&q))
	{
		printf("%c", q._front->_data->_data);
		if (q._front->_data->_left)
			QueuePush(&q, q._front->_data->_left);
		if (q._front->_data->_right)
			QueuePush(&q, q._front->_data->_right);
		QueuePop(&q);
	}
	printf("\n");
	QueueDestroy(&q);
}

// 层序遍历
//需要用到队列,数字
void BinaryTreeLevelOrder1(BTNode* root)
{
	if (NULL == root)
		return;
	Queue q;
	QueueInit(&q);
	QueuePush(&q, root);
	while (!QueueEmpty(&q))
	{
		printf("%d", q._front->_data->_data);
		if (q._front->_data->_left)
			QueuePush(&q, q._front->_data->_left);
		if (q._front->_data->_right)
			QueuePush(&q, q._front->_data->_right);
		QueuePop(&q);
	}
	printf("\n");
	QueueDestroy(&q);
}
 //判断二叉树是否是完全二叉树
bool BinaryTreeComplete(BTNode* root)
{
	if (NULL == root)
		return false;
	Queue q;
	QueueInit(&q);
	QueuePush(&q, root);
	while (!QueueEmpty(&q))
	{
		if (NULL == q._front->_data)
		{
			QueuePop(&q);
			break;
		}
		QueuePush(&q, q._front->_data->_left);
		QueuePush(&q, q._front->_data->_right);
		QueuePop(&q);
	}
	while (!QueueEmpty(&q))
	{
		if (NULL != q._front->_data)
		{
			QueueDestroy(&q);
			return false;
		}
		QueuePop(&q);
	}
	QueueDestroy(&q);
	return true;
}
//求树的高度
int TreeSize1(BTNode* root)
{
	if (NULL == root)
	{
		return 0;
	}
	int leftnum = TreeSize1(root->_left);
	int rightnum = TreeSize1(root->_right);
	return leftnum > rightnum ? leftnum + 1 : rightnum + 1;
}

三、BTreeTest.c

#include"BTree.h"

BTNode* BuyNode(BTDataType x)
{
	BTNode* node = (BTNode*)malloc(sizeof(BTNode));
	if (node == NULL)
	{
		perror("malloc fail");
		return NULL;
	}

	node->_data = x;
	node->_left = NULL;
	node->_right = NULL;

	return node;
}

BTNode* CreatBinaryTree()
{
	BTNode* node1 = BuyNode(1);
	BTNode* node2 = BuyNode(2);
	BTNode* node3 = BuyNode(3);
	BTNode* node4 = BuyNode(4);
	BTNode* node5 = BuyNode(5);
	BTNode* node6 = BuyNode(6);
	BTNode* node7 = BuyNode(7);


	node1->_left = node2;
	node1->_right = node4;
	node2->_left = node3;
	node4->_left = node5;
	node4->_right = node6;
	node2->_right = node7;

	return node1;
}

int main()
{
	// 通过前序遍历的数组"ABD##E#H##CF##G##"构建二叉树
	int i = 0;
	char a[100] = { "ABD##E#H##CF##G##" };
	BTNode* root = BinaryTreeCreate(a, &i);
	// 二叉树节点个数
	printf("二叉树节点个数:%d\n", BinaryTreeSize(root));
	// 二叉树叶子节点个数
	printf("二叉树叶子节点个数:%d\n", BinaryTreeLeafSize(root));
	// 二叉树第k层节点个数
	int k = 1;
	printf("第%d层节点个数%d\n", k,BinaryTreeLevelKSize(root, k));
	k = 2;
	printf("第%d层节点个数%d\n", k, BinaryTreeLevelKSize(root, k));
	k = 3;
	printf("第%d层节点个数%d\n", k, BinaryTreeLevelKSize(root, k));
	k = 4;
	printf("第%d层节点个数%d\n", k, BinaryTreeLevelKSize(root, k));
	k = 5;
	printf("第%d层节点个数%d\n", k, BinaryTreeLevelKSize(root, k));


	// 二叉树查找值为x的节点
	BTNode* find = BinaryTreeFind(root, 'E');

	// 二叉树前序遍历 
	BinaryTreePrevOrder(root);
	printf("\n");
	// 二叉树中序遍历
	BinaryTreeInOrder(root);
	printf("\n");
	// 二叉树后序遍历
	BinaryTreePostOrder(root);
	printf("\n");


	// 层序遍历
	BinaryTreeLevelOrder(root);
	printf("\n");
	// 判断二叉树是否是完全二叉树,不是
	printf("第一个判断%d", BinaryTreeComplete(root));
	printf("\n");


	BTNode* test = CreatBinaryTree();
	BinaryTreeLevelOrder1(test);
	// 判断二叉树是否是完全二叉树,是
	printf("第二个判断%d", BinaryTreeComplete(test));
	return 0;
}
相关推荐
夏末秋也凉5 分钟前
力扣-回溯-131 分割回文串
算法·leetcode
努力可抵万难9 分钟前
【算法系列】leetcode1419 数青蛙 --模拟
c++·算法·模拟
ww180009 分钟前
多目标粒子群优化算法-MOPSO-(机器人路径规划/多目标信号处理(图像/音频))
人工智能·算法·分类·信号处理
YH_DevJourney18 分钟前
Linux-C/C++《C/9、信号:基础》(基本概念、信号分类、信号传递等)
linux·c语言·c++
CS创新实验室20 分钟前
计算机考研之数据结构:大 O 记号
数据结构·考研
让我们一起加油好吗43 分钟前
【数学】数论干货(疑似密码学基础)
c语言·visualstudio·密码学
wen__xvn2 小时前
每日一题洛谷P1914 小书童——凯撒密码c++
数据结构·c++·算法
BUG 劝退师2 小时前
八大经典排序算法
数据结构·算法·排序算法
m0_748240913 小时前
SpringMVC 请求参数接收
前端·javascript·算法
小林熬夜学编程3 小时前
【MySQL】第八弹---全面解析数据库表的增删改查操作:从创建到检索、排序与分页
linux·开发语言·数据库·mysql·算法