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功能: 还有就是, ...
随机推荐
- QT的mouseMoveEvent事件失效
void TalkWindow::enterEvent(QEvent *event){ grabMouse();}void TalkWindow::leaveEvent(QResizeEvent *e ...
- C#中internal关键字
对于一些大型的项目,通常由很多个DLL文件组成,引用了这些DLL,就能访问DLL里面的类和类里面的方法.比如,你写了一个记录日志的DLL,任何项目只要引用此DLL就能实现记录日志的功能,这个DLL文件 ...
- 推荐一个可以把网页背景色调成护眼色的Chrome扩展应用
程序员一天有10几个小时要面对着电脑,老是这种白晃晃的屏幕,谁的眼睛受得了? 我在网上逛了一圈,找到一个比较实用的Chrome扩展应用,可以一键实现将Chrome打开网页的背景色修改成护眼的豆沙绿,这 ...
- Geekforgeek week1
1. is palindrome solution 1: check to reverse the digit, if they are the same number https://www.gee ...
- 475. Heaters (start binary search, appplication for binary search)
Winter is coming! Your first job during the contest is to design a standard heater with fixed warm r ...
- Eclipse环境下配置Tomcat,并且把项目部署到Tomcat服务器上
一 配置Tomcat 1.打开Eclipse,单击"Window"菜单,选择下方的"Preferences". 2.单击"Server"选项 ...
- Javascript 中 Array的 sort()和 compare()方法
Javascript 中 Array的 sort()方法其实是把要排序的内容转化为string(调用 toString()), 然后按照字符串的第一位 ascii 码先后顺序进行比较,不是数字. 我们 ...
- 【转】Android开发:shape和selector和layer-list的(详细说明)
<shape>和<selector>在Android UI设计中经常用到.比如我们要自定义一个圆角Button,点击Button有些效果的变化,就要用到<shape> ...
- 2019.1.6 2.8 Spring的AOP事务
2.8 Spring的AOP事务 xml配置aop事务 先applicationContext.xml 文件 配置事务管管理器 配置通知 织入目标对象
- java Thread 类 run 和 start 方法区别
public class ThreadModle { public static void main(String[] args) throws InterruptedException { Thre ...