二叉树的功能实现(C语言)

疯狂学习的代码小白又来啦!
从上篇博客过来的童鞋们可能知道我这篇要写什么
上篇博客我通过自己的学习个人总结了一下树的基本概念
因此这篇我就来加载自己当时学习时写的树的C语言代码

首先我们要用结构体来定义树的结点…

typedef struct TreeNode
{
	TYPE_T data;
	struct TreeNode* left;
	struct TreeNode* right;
}TreeNode;

紧接着我们就要来进行实现树的各种操作的函数的声明…

//创建结点
TreeNode* creat_node(TYPE_T data);
//添加
void add_tree(TreeNode** root,TYPE_T data);
//删除
bool del_tree(TreeNode** root,TYPE_T data);
//访问
void _access_tree(TreeNode* root,size_t i,TYPE_T* p,size_t* indexp);
bool access_tree(TreeNode* root,size_t i,TYPE_T* p);
//前序遍历
void prev_show(TreeNode* root);
//中序遍历
void in_show(TreeNode* root);
//后序遍历
void post_show(TreeNode* root);
//层序遍历
void level_show(TreeNode* root);
//高度
size_t high_tree(TreeNode* root);
//密度
size_t density_tree(TreeNode* root);

然后实现树的结点的创建:

TreeNode* creat_node(TYPE_T data)
{
	TreeNode* node = malloc(sizeof(TreeNode));
	node->data = data;
	node->left = NULL;
	node->right = NULL;
	return node;
}

继续实现树的结点的添加(运用递归操作)

void _add_tree(TreeNode** root,TreeNode* node)
{
	if(NULL == *root) //当根结点为空时
	{
		*root = node;
		return;
	}
	if((*root)->data > node->data)
		_add_tree(&(*root)->left,node);
	else
		_add_tree(&(*root)->right,node);
}
void add_tree(TreeNode** root,TYPE_T data)
{
	_add_tree(root,creat_node(data));
}

接着对于树的结点删除的实现

bool del_tree(TreeNode** root,TYPE_T data)
{
	if(NULL == *root) return false;
	if((*root)->data == data)
	{
		TreeNode* node = *root;
		*root = node->left;
		_add_tree(&(*root),node->right);
		free(node);
		return true;
	}
	else if((*root)->data > data)
		return del_tree(&(*root)->left,data);
	else
		return del_tree(&(*root)->right,data);
}

然后 访问树的结点(也是使用了递归)

void _access_tree(TreeNode* root,size_t i,TYPE_T* p,size_t* indexp)
{
	if(NULL == root) return;
	_access_tree(root->left,i,p,indexp);
	if(i == *indexp)
	{
		*p = root->data;
		*indexp += 1;
		return;
	}
	*indexp += 1;
	_access_tree(root->right,i,p,indexp);
}
bool access_tree(TreeNode* root,size_t i,TYPE_T* p)
{
	if(i >= density_tree(root)) return false;

	size_t index = 0;
	_access_tree(root,i,p,&index);
	return true;
}

树的前、中、后遍历

void prev_show(TreeNode* root)
{  //前序遍历
	if(NULL == root) return;
	printf("%d ",root->data);
	prev_show(root->left);
	prev_show(root->right);
}
void in_show(TreeNode* root)
{  //中序遍历	
	if(NULL == root) return;
	in_show(root->left);
	printf("%d ",root->data);
	in_show(root->right);
}
void post_show(TreeNode* root)
{  //后序遍历	
	if(NULL == root) return;
	post_show(root->left);
	post_show(root->right);
	printf("%d ",root->data);
}

实现树的高度与密度

size_t high_tree(TreeNode* root)
{  //高度
	if(NULL == root) return 0;
	size_t lh = high_tree(root->left);
	size_t rh = high_tree(root->right);
	return lh > rh ? lh+1 : rh+1;
}

size_t density_tree(TreeNode* root)
{   //密度
	if(NULL == root) return 0;
	return 1+density_tree(root->left)+density_tree(root->right);
}

最后来实现树的层序遍历,因为层序遍历要借助队列操作,因此实现这功能要多文件操作
为了节省空间我这边就不发我的队列实现功能代码

void level_show(TreeNode* root)
{
	Queue* queue = creat_queue();  //创建队列
	push_queue(queue,root);  	//把根结点入队
	
	while(!empty_queue(queue)) //当队列非空时
	{
		TreeNode* node = *head_queue(queue); 
		printf("%d ",node->data);
		if(node->left) push_queue(queue,node->left);
		if(node->right) push_queue(queue,node->right);
		pop_queue(queue);
	}
	printf("\n");
}

以上就是二叉树的基本功能的实现C语言代码
总的来说
在我刚学数据结构开始,会觉得这些代码有些难以理解,不过在你学的差不多的时候你会觉得链表、栈、队列、树、图的代码其实基本上差不多,并且大都都可以结合一起使用,虽然我现在学的还不是很好但也不会放弃,所以童鞋们也要加油哦,不要放弃!

你可能感兴趣的:(数据结构)