疯狂学习的代码小白又来啦!
从上篇博客过来的童鞋们可能知道我这篇要写什么
上篇博客我通过自己的学习个人总结了一下树的基本概念
因此这篇我就来加载自己当时学习时写的树的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语言代码
总的来说
在我刚学数据结构开始,会觉得这些代码有些难以理解,不过在你学的差不多的时候你会觉得链表、栈、队列、树、图的代码其实基本上差不多,并且大都都可以结合一起使用,虽然我现在学的还不是很好但也不会放弃,所以童鞋们也要加油哦,不要放弃!