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功能: 还有就是, ...
随机推荐
- 贴现力 (force of discount)
一.定义 用贴现函数a-1(t) 代替累积函数,在 t 时刻的贴现力为 增加一个负号使得贴现力为正. 二.重要的公式
- Java内存使用情况查看工具
Java通过jvm自己管理内存,同时Java提供了一些命令行工具,用于查看内存使用情况.这里主要介绍一下jstat.jmap命令以及相关工具. 一.jstat查看 gc实时执行情况 jstat命令命令 ...
- jave web 监听器。
https://www.imooc.com/video/5664 Web监听器由Servlet规范提供的,可以监听客户端的请求以及服务端的操作,即监听ServletContext.HttpSessio ...
- 优秀 Java 程序员写代码的风格,不再留坑给别人
往 期 精 彩 推 荐 [1]Java Web技术经验总结 [2]15个顶级Java多线程面试题及答案,快来看看吧 [3]面试官最喜欢问的十道java面试题 [4]从零讲JAVA ,给你一条清晰 ...
- [原]Ubuntu 下安装Mongodb
Mongodb是一款开源的数据库,这里不用我多说了,下面说一下Ubuntu下安装Mongodb可能遇到的问题和解决方案. 故事背景: 今天M$促销,1¥Windows Azure 4000¥-30天的 ...
- mangodb驱动编译
1.Installing the MongoDB C Driver (libmongoc) and BSON library (libbson) Building on Windows with Vi ...
- 使用ArcSDE SQL操作怎么获得新对象的objectid、GUID
arcgis9.3.1 现在大家很喜欢使用ArcSDE的SQL操作,这种方式在特殊的环境要求下显得比较方便,那么使用SQL操作最多的是读和写,而写最多的就是新建一个对象,那么翻译成SQL语言就是使用i ...
- UVa 1626 - Brackets sequence(区间DP)
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- 2018 Multi-University Training Contest 4 Problem K. Expression in Memories 【模拟】
任意门:http://acm.hdu.edu.cn/showproblem.php?pid=6342 Problem K. Expression in Memories Time Limit: 200 ...
- 根据用户id生成一个唯一邀请码
需求描述:根据用户id生成与之对应的唯一邀请码,范围为‘0-9A-Z’. 这个需求的重点在于加粗的部分,也就是要能够根据邀请码反推出用户ID,这样邀请码就不用入库了,在用户量很大的情况下,性能可以得到 ...