C语言之二叉树
规定:根节点的值大于左节点但小于右节点的值,所以二叉树的值插入是唯一的,最后形成的树只跟根节点有关
定义节点:
struct tree_node {
TypeElem elem;
struct tree_node *fa;
struct tree_node *left;
struct tree_node *right;
};
#include <stdio.h>
#include <stdlib.h> typedef int TypeElem; struct tree_node {
TypeElem elem;
struct tree_node *fa;
struct tree_node *left;
struct tree_node *right;
}; struct tree_node *root_ptr; //指向根节点的指针 #define IS_ROOT_NODE(ptree_fa, ptree, x) do{ if(ptree_fa) { \
if (ptree == ptree_fa->left) \
ptree_fa->left = x; \
else if (ptree == ptree_fa->right) \
ptree_fa->right = x; \
}else \
root_ptr = x; }while () //如果删除的是根节点root_ptr就变了 /* 在父节点下插入子节点(有可能是孙子节点了) */
struct tree_node *Insert(TypeElem elem, struct tree_node *T_fa, struct tree_node *T)
{
if (T == NULL) {
T = (struct tree_node *)malloc(sizeof(struct tree_node));
if (!T) {
printf("malloc error\n");
return NULL;
}
T->fa = T_fa;
T->elem = elem;
T->left = T->right = NULL;
}
else if (elem < T->elem)
T->left = Insert(elem, T, T->left);
else if (elem > T->elem)
T->right = Insert(elem, T, T->right); return T;
} struct tree_node *find_val(struct tree_node *rootp, TypeElem elem)
{
if (!rootp) {
printf("don't find\n");
return NULL;
}
//遍历:前序、中序、后序
if (rootp->elem == elem)
return rootp;
else if (rootp->elem > elem) {
return find_val(rootp->left, elem); //递归
}
else if (rootp->elem < elem) {
return find_val(rootp->right, elem); //递归
}
return NULL;
} struct tree_node *find_min_val(struct tree_node *rootp)
{
while (rootp->left) {
rootp = rootp->left;
}
return rootp;
} struct tree_node *find_max_val(struct tree_node *rootp)
{
while (rootp->right) {
rootp = rootp->right;
}
return rootp;
} int delete_tree(TypeElem elem, int isfree)
{
struct tree_node *ptree = find_val(root_ptr, elem);
struct tree_node *ptree_fa = ptree->fa;
struct tree_node *min_tree; if (!ptree)
return -;
if (!(ptree->left) && !(ptree->right)) {
IS_ROOT_NODE(ptree_fa, ptree, NULL);
}
else if (!(ptree->left) && ptree->right) {
IS_ROOT_NODE(ptree_fa, ptree, ptree->right);
ptree->right->fa = ptree_fa;
}
else if (ptree->left && !(ptree->right)) {
IS_ROOT_NODE(ptree_fa, ptree, ptree->left);
ptree->left->fa = ptree_fa;
}
else if (ptree->left && ptree->right) {
min_tree = find_min_val(ptree->right);
delete_tree(min_tree->elem, ); //递归
IS_ROOT_NODE(ptree_fa, ptree, min_tree);
min_tree->left = ptree->left;
min_tree->right = ptree->right;
min_tree->fa = ptree->fa;
}
if (isfree)
free(ptree);
return ;
} int main()
{
int i;
root_ptr = Insert(, NULL, root_ptr); //得到指向根节点的指针
TypeElem a[] = { ,,,,,,,, }; //依次插入9个节点
for (i = ; i < ; i++)
Insert(a[i], root_ptr->fa, root_ptr);
if (!delete_tree(, ))
printf("delete_tree ok\n");
if (root_ptr) {
if (find_val(root_ptr, ))
printf("find node\n");
}
return ;
}
形成的树结构:

如果删除根节点6,依然能找到节点9
C语言之二叉树的更多相关文章
- C语言实现二叉树-02版
---恢复内容开始--- 昨天,提交完我们的二叉树项目后,今天早上项目经理早早给我打电话: 他说,小伙子干的不错.但是为什么你上面的insert是recusive的呢? 你难道不知道万一数据量大啦!那 ...
- C语言实现二叉树-利用二叉树统计单词数目
昨天刚参加了腾讯2015年在线模拟考: 四道大题的第一题就是单词统计程序的设计思想: 为了记住这一天,我打算今天通过代码实现一下: 我将用到的核心数据结构是二叉树: (要是想了解简单二叉树的实现,可以 ...
- C语言实现二叉树
二叉树的重要性就不用多说啦: 我以前也学习过,但是一直没有总结: 网上找到的例子,要么是理论一大堆,然后是伪代码实现: 要么是复杂的代码,没有什么解释: 最终,还是靠FQ找到一些好的文章,参考地址我会 ...
- C语言实现二叉树的基本操作
二叉树是一种非常重要的数据结构.本文总结了二叉树的常见操作:二叉树的构建,查找,删除,二叉树的遍历(包括前序遍历.中序遍历.后序遍历.层次遍历),二叉搜索树的构造等. 1. 二叉树的构建 二叉树的基本 ...
- C语言描述二叉树的实现及操作(链表实现)
概述 二叉树为每个节点最多有两个儿子节点(左儿子节点和右儿子节点)的树. 前序遍历:根结点 ---> 左子树 ---> 右子树. 中序遍历:左子树---> 根结点 ---&g ...
- C语言数据库-二叉树
一.定义 二叉树在图论中是这样定义的:二叉树是一个连通的无环图,并且每一个顶点的度不大于3.有根二叉树还要满足根结点的度不大于2.有了根结点之后,每个顶点定义了唯一的父结点,和最多2个子结点.然而,没 ...
- go语言浅析二叉树
Hello,各位小伙伴大家好,我是小栈君,今天给大家带来的分享是关于关于二叉树相关的知识点,并用go语言实现一个二叉树和对二叉树进行遍历. 我们主要针对二叉树的概念,go实战实现二叉树的前序遍历.中序 ...
- c语言_二叉树的建立以及3种递归
二叉树c语言的实现 二叉树的建立 二叉树的数据结构 typedef struct node{ int data; struct node* left; struct node* ri ...
- C语言实现二叉树-04版
二叉树,通常应当是研究其他一些复杂的数据结构的基础.因此,通常我们应该精通它,而不是了解:当然,可能并不是每个人都认同这种观点,甚至有些人认为理解数据结构就行了!根本没有必要去研究如何实现,因为大多数 ...
- C语言实现二叉树-03版
我们亲爱的项目经理真是有创意,他说你给我写得二叉树挺好的: 功能还算可以:插入节点,能够删除节点: 可是有时候我们只是需要查找树的某个节点是否存在: 所以我希望你能够给我一个find功能: 还有就是, ...
随机推荐
- JavaScript返回上一页
目前来说有两种方法: window.history.back(); // 返回上一页不刷新 window.location.href = document.referrer; // 返回上一页并刷新
- dbms_stats应用相关
Q: DBMS_STATS.GATHER_SCHEMA_STATS ('schema_name'); 使用这个收集统计信息,estimate_percent使用默认值 ...
- linux配置sudo
编辑/etc/sudoers或者直接使用root用户运行visodu 添加如下两行:oracle ALL=(ALL) NOPASSWD: ALLoinstall ALL=( ...
- nginx限制IP恶意调用短信接口处理方法
真实案例: 查看nginx日志,发现别有用心的人恶意调用API接口刷短信: /Jun/::: +] "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) ...
- 重大漏洞!PHP multipart/form-data头部解析远程拒绝服务漏洞
"有些人看不懂,简单比喻来说吧:目前刚出的任何安全防护都不会拦,网站类专属漏洞 畸形数据包,2KB随机数据包,2M网速打死各种网站,cdn通挂!"PHP multipart/for ...
- NET对象的跨应用程序域
NET对象的跨应用程序域 转眼就到了元宵节,匆匆忙忙的脚步是我们在为生活奋斗的写照,新的一年,我们应该努力让自己有不一样的生活和追求.生命不息,奋斗不止.在上篇博文中主要介绍了.NET的AppDoma ...
- What Is a Computer System?
What Is a Computer System? A combination of Five or Six Elements The term computer is used to descri ...
- gulp使用方法总结
gulp是用于前端构建的基于文件流的一套工具.可以用于压缩.编译.合并.检查文件等操作.可以节省大量的用于繁琐重复操作的人力.最开始就是安装gulp工具了,在命令行中切换到工作的文件目录下,安装gul ...
- springMVC文件上传大小超过限制的问题
[转自]https://my.oschina.net/ironwill/blog/646762 springMVC是一个非常方便的web层框架,我们使用它的文件上传也非常的方便. 我们通过下面的配置来 ...
- 计算机网络概述4_性能指标之时延,时延带宽积,往返时间RTT,利用率
发送时延(传输时延):从发送分组的第一个比特算起,到该分组的最后一个比特发送完毕所需的时间. 总结: