二叉查找树要求,在树中的任意一个节点,其【左子树】中的每个节点的值,都要【小于】这个节点的值,而【右子树】节点的值都【大于】这个节点的值。


目录

1. 头文件

1.1 include

1.2  定义树是否为空

1.3 树的数据结构

1.4 节点结构体

1.5 树结构体

2. 创建空树

2.1 给树赋空间,malloc

2.2 判断树是否创建成功

2.3 给树的各个参数赋值

2.4 返回树

3. 查找

3.1 创建指针,用于搜索

3.2 判断树是否存在&树为空

3.3 循环,比较值得大小,直接找到节点

3.4 返回节点

4. 插入节点

4.1 判断树是否为空

4.2 创建空节点,判断是否创建成功,给参数赋值

4.3 插入节点

4.3.1 树为空

4.3.2 树不为空

4.4 树不为空,创建空指针来查找

4.5 进入循环,比较大小,判断节点进入左子节点,还是右子节点

5. 删除节点

5.1 三种情况

5.1.1 删除的节点没有子节点

5.1.2 删除的节点有一个子节点

5.1.3 删除的节点有两个子节点

5.2 创建四个指针

5.3 判断树是否存在 & 树是否为空

5.4 循环指针,直到找到待删除接节点

5.5 判断节点是否有两个子节点

5.6 判断待删除结点有一个子节点或者为NULL

5.7 判断node在pnode的左/右子节点

5.8 free(node) ; tree->size--;

6. 递归方式删除结点

7. 中序遍历打印树节点

8. compare 函数

9. 主函数

10. 总览代码

11. 代码结果


1. 头文件

1.1 include

1.2  定义树是否为空

1.3 树的数据结构

1.4 节点结构体

1.5 树结构体

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
/*树是否为空*/
#define bstree_is_empty(tree)(tree->size == 0)
/*树的数据类型*/
typedef int type;
/*结点结构*/
typedef struct bstree_node {type data;struct bstree_node* lchild;struct bstree_node* rchild;
}stbstree_node;
/*树结构*/
typedef struct bstree {int size;int (*compare)(type key1, type key2);int (*destory)(type data);stbstree_node* root;
}stbstree;/*定义指针*/
typedef int (*compare_fuc)(type key1, type key2);       //key1 > key2  返回1  否则  返回-1
typedef int (*destory_fuc)(type data);

2. 创建空树

2.1 给树赋空间,malloc

2.2 判断树是否创建成功

2.3 给树的各个参数赋值

2.4 返回树

stbstree* bstree_create(compare_fuc compare,destory_fuc destory) {stbstree* tree = NULL;tree = (stbstree*)malloc(sizeof(stbstree));if (tree == NULL) {return NULL;}tree->size = 0;tree->compare = compare;tree->destory = destory;tree->root = NULL;return tree;
}

3. 查找

3.1 创建指针,用于搜索

3.2 判断树是否存在&树为空

3.3 循环,比较值得大小,直接找到节点

3.4 返回节点

stbstree_node* bstree_search(stbstree* tree, type data) {stbstree_node* node = NULL;int res = 0;if (tree == NULL && bstree_is_empty(tree)) {return NULL;}node = tree->root;while (node != NULL) {res = tree->compare(data, node->data);if (res == 0) {return node;}else if (res > 0) {node = node->rchild;}else {node = node->rchild;}}return NULL;
}

4. 插入节点

4.1 判断树是否为空

4.2 创建空节点,判断是否创建成功,给参数赋值

4.3 插入节点

4.3.1 树为空

4.3.2 树不为空

4.4 树不为空,创建空指针来查找

4.5 进入循环,比较大小,判断节点进入左子节点,还是右子节点

/*插入结点*/
int bstree_insert(stbstree* tree, type data) {stbstree_node* node = NULL;           //插入结点stbstree_node* tmp = NULL;            //代替树的头指针int res = 0;if (tree == NULL) {return -1;} node = (stbstree_node*)malloc(sizeof(stbstree_node));if (node == NULL) {return - 2;}node->data = data;node->lchild = NULL;node->rchild = NULL;if (bstree_is_empty(tree)){tree->root = node;tree->size++;return 0;}tmp = tree->root;        while (tmp != NULL) {res = tree->compare(data,tmp->data);if (res > 0) {if (tmp->rchild == NULL) {tmp->rchild = node;tree->size++;return 0;}tmp = tmp->rchild;}else {if (tmp->lchild == NULL) {tmp->lchild == node;tree->size++;return 0;}tmp = tmp->lchild;}}
}

5. 删除节点

5.1 三种情况

5.1.1 删除的节点没有子节点

5.1.2 删除的节点有一个子节点

5.1.3 删除的节点有两个子节点

5.2 创建四个指针

分别是删除节点、待删除结点的父节点、最小节点、最小节点的父节点

5.3 判断树是否存在 & 树是否为空

5.4 循环指针,直到找到待删除接节点

5.5 判断节点是否有两个子节点

如果有,找到删除节点右子树的最小节点,替换节点值,将node、pnode指向minnode、pminnode,这样待删除节点只有一个右节点或者没有(因为是最小节点,不会有左子节点,不然,就不是最小节点)

5.6 判断待删除结点有一个子节点或者为NULL

                        将minnode指针指向它

5.7 判断node在pnode的左/右子节点

  将minnode赋给pnode的左/右子节点

5.8 free(node) ; tree->size--;

int bstree_delete(stbstree* tree, type data) {stbstree_node* node = NULL;             //待删除结点stbstree_node* pnode = NULL;            //待删除结点的父节点stbstree_node* minnode = NULL;          //最小结点stbstree_node* pminnode = NULL;         //最小结点的父节点type tmp = 0;int res = 0;if (tree == NULL || bstree_is_empty(tree)) {return -1;}node = tree->root;while (node != NULL && (res = tree->compare(data, node->data)) != 0) {     //node为NULL 和 找到删除结点pnode = node;if (res > 0) {node = node->rchild;}else {node = node->lchild;}}if (node == NULL) {return -2;}                                                               //已找到删除结点,判断删除结点有几个子节点if (node->lchild != NULL && node->rchild != NULL) {minnode = node->rchild;                                     //需要找到右子树的最小结点,替换到删除结点,删除最小结点,因为最小节点肯定没有左子结点pminnode = node;while (minnode->lchild != NULL) {pminnode = minnode;minnode = minnode->lchild;}                                                          //找到最小结点tmp = node->data;                                           //替换结点值node->data = minnode->data;minnode->data = tmp;node = minnode;                                             //将node、pnode指针指向minnode、pminnodepnode = pminnode;                                           //node只有一个子节点或没有子节点}/*接下来按照只有一个子结点,或者没有子节点来删除结点*///判断有哪个子节点if (node->lchild != NULL) {minnode = node->lchild;}else if (node->rchild != NULL) {minnode = node->rchild;}else {minnode = NULL;}//删除node结点,将pnode指针指向minnodeif (pnode == NULL) {tree->root = minnode;}else if(pnode->lchild == node){pnode->lchild = minnode;}else {pnode->rchild = minnode;}tree->size--;free(node);return 0;
}

6. 递归方式删除结点

void bstree_destory_node(stbstree* tree,stbstree_node* root){if (root == NULL) {return;}bstree_destory_node(tree, root->lchild);bstree_destory_node(tree, root->rchild);free(root);
}

7. 中序遍历打印树节点

void bstree_inorder(stbstree_node* root) {if (root == NULL) {return;}bstree_inorder(root->lchild);printf(" %d ", root->data);bstree_inorder(root->rchild);return;
}

8. compare 函数

int bstree_compare(type key1, type key2) {if (key1 == key2) {return 0;}else if (key1 > key2) {return 1;}else {return -1;}
}

9. 主函数

int main() {stbstree* tree = NULL;stbstree_node* node = NULL;type data = 0;int res = 0;tree = bstree_create(bstree_compare, NULL);while (1) {printf("插入一个数字,输入100时退出:\n");scanf_s("%d", &data);if (data == 100)break;res = bstree_insert(tree, data);printf("%d 插入%s成功\n", data, (res != 0) ? ("不") : (""));}bstree_inorder(tree->root);
}

10. 总览代码

11. 代码结果

发现问题了吗,代码自能打印出左子树,55,插入,打印都没有问题,就是打印不出来,容我慢慢改...

二叉查找树--C语言相关推荐

  1. 数据结构:二叉查找树(C语言实现)

    数据结构:二叉查找树 二叉查找树 基础知识 关于二叉树的基础知识,请看我的一篇博客:二叉树的链式存储 二叉查找树的特征 二叉查找树或者是一棵空树,或者是具有下列性质的二叉树: 1.若其左子树不空,则左 ...

  2. 二叉树知识点最详细最全讲解

    目录 1.树的介绍 1.1树的定义 1.2树的基本术语 1.3相关性质 2.二叉树的介绍 2.1二叉树的定义 2.2二叉树与度为2的树的区别 2.3二叉树的性质 3.二叉树的种类 3.1满二叉树 3. ...

  3. c语言二叉排序树的创建与查找,C语言实现二叉查找树的插入和删除操作问题求教...

    使用C语言实现二叉查找树的插入和删除操作,但在 return searchBST( T->rchild, val, f, p);出错.这里应该使用了双指针,求教应该怎么改才正确. /* +--- ...

  4. C语言二叉查找树练习:单词查找

    暑假来了,二月时光可不能荒废了啊.于是决定前一个月学好数据结构与算法. 上一次已经写了一个链表的练习了,这次就决定写一个二叉查找树的练习. 记得以前看过<The C Programming La ...

  5. Algorithm:树相关算法(BBT/BST/B树/R树)简介(二叉查找树、二叉查找树的插入节点、二叉查找树的删除、二叉树的遍历、平衡二叉树)C 语言实现

    Algorithm:树相关算法(BBT/BST/B树/R树)简介(二叉查找树.二叉查找树的插入节点.二叉查找树的删除.二叉树的遍历.平衡二叉树)C++语言实现 目录 树的基础知识 1.二叉树的遍-前序 ...

  6. 二叉查找树(一)之 C语言的实现

    二叉查找树(一)之 图文解析 和 C语言的实现 概要 本章先对二叉树的相关理论知识进行介绍,然后给出C语言的详细实现.关于二叉树的学习,需要说明的是:它并不难,不仅不难,而且它非常简单.初次接触树的时 ...

  7. 二叉查找树(一)之 图文解析 和 C语言的实现

    本文转载至http://www.cnblogs.com/skywang12345/p/3576328.html 二叉查找树(一)之 图文解析 和 C语言的实现 概要 本章先对二叉树的相关理论知识进行介 ...

  8. 二叉查找树的C语言实现(二)

    接着上次的话题.这次我们要讨论,二叉查找树的中序遍历和后序遍历(递归和非递归),另外还有先序遍历(非递归) 1.中序遍历(递归) static void __in_order(struct bnode ...

  9. 二叉查找树的C语言实现(一)

    什么是二叉查找树? 二叉查找树(Binary Search Tree),也称有序二叉树(ordered binary tree),排序二叉树(sorted binary tree),是指一棵空树或者具 ...

最新文章

  1. 将Quartz.NET集成到 Castle中
  2. MyBatis-24MyBatis缓存配置【集成EhCache】
  3. 搭建prometheus+grafana监控系统
  4. 关于CS1061报错(XX不包含XXX的定义,并且找不到类型为XX的第一个参.....)的一种可能的解决的办法...
  5. jmeter异步请求测试_使用JMeter对异步HTTP / REST服务进行压力/负载测试
  6. mysql 计算近30天总金额_mysql┃一条更新语句是怎么执行的???
  7. 随笔27 面向对象的五大基本原则
  8. J2EE常用Listener(转载)
  9. ThinkPHP 3.2 DEMO案例系列【phpmailer批量发送邮件】
  10. 中小企业数智化转型,这个百万级客户市场差点被遗忘
  11. 深入学习javascript:cookie
  12. linux环境安装ffmepg,Linux centOS下安装FFmpeg
  13. 站在搜索引擎的视角看ASO,aso商店搜索引擎优化
  14. UltraEdit 26 总是偶尔提示运行的是试用模式
  15. IPhone UC 浏览器基于cookie登录的用户无法退出(无法删除 cookie)问题
  16. 台式机怎么开启 无线lan服务器,台式机没有无线网卡怎么样实现上网
  17. 【转载】7个最佳的双因素认证解决方案
  18. 微信web端生成支付二维码
  19. redist 在linux上的安装教程
  20. DataNode新节点服役与旧节点退役

热门文章

  1. 在IDEA中如何使用tomcat部署项目
  2. 开个精品水果店前景怎么样,开一家水果店的前景
  3. 泰拉瑞亚 Terraria
  4. 电话号码正则表达式(包含电话号码和手机号码)
  5. 光学液氮恒温器T9015-4W的技术参数
  6. 高防服务器的重要性及其在互联网安全中的作用
  7. 一建考增项,你应该怎么选?
  8. Alexa排名的常识
  9. 文本摘要 - 使用 TextRank4ZH 抽取中文文本摘要
  10. 毕业生、待业毕业生应该做的几件事