数据结构 | 二叉排序树

一、数据结构定义

/* 二叉排序树 */
typedef int TreeType;
typedef struct BSTNode {TreeType data;struct BSTNode* lchild, * rchild;
}*BSTree, BSTNode;

二、方法概览

BSTNode* CreateTreeNode(TreeType data); // 创建二叉树结点
BSTNode* InsertTree(TreeType data, BSTree root); // 插入元素
void PreOrder(BSTree T); // 先序遍历
void InOrder(BSTree T);	 // 中序遍历
BSTree FindMin(BSTree T);  // 查找最小值,返回该结点
BSTree FindMax(BSTree T);  // 查找最大值,返回该结点
BSTree FindKey_nonrecursion(BSTree T, TreeType key);	// 查找指定数据元素(非递归)
BSTree FindKey_recursion(BSTree T, TreeType key);		// 查找指定数据元素(递归)
BSTree DeleteData(BSTree T, TreeType element);			// 删除指定元素的结点

三、方法详解

// 创建二叉树结点
BSTNode* CreateTreeNode(TreeType data) {BSTNode* p = (BSTNode*)malloc(sizeof(struct BSTNode));p->lchild = p->rchild = NULL;p->data = data;return p;
}
// 插入元素
BSTNode* InsertTree(TreeType data, BSTree root){if (root == NULL) {root = CreateTreeNode(data);return root;}if (data < root->data)root->lchild = InsertTree(data, root->lchild);if (data > root->data)root->rchild = InsertTree(data, root->rchild);return root;
}
// 先序遍历
void PreOrder(BSTree T){if (T == NULL) return;printf("%d ", T->data);PreOrder(T->lchild);PreOrder(T->rchild);
}
// 中序遍历
void InOrder(BSTree T){if (T == NULL) return;InOrder(T->lchild);printf("%d ", T->data);InOrder(T->rchild);
}
// 查找最小值,返回该结点
BSTree FindMin(BSTree T){if (T == NULL) return NULL;BSTree min = T;while (min->lchild != NULL)min = min->lchild;return min;
}
// 查找最大值,返回该结点
BSTree FindMax(BSTree T){if (T == NULL) return NULL;BSTree max = T;while (max->rchild != NULL)max = max->rchild;return max;
}
// 查找指定数据元素(非递归)
BSTree FindKey_nonrecursion(BSTree T, TreeType key) {while (T != NULL && key != T->data) {if (T->data > key) T = T->lchild;else T = T->rchild;}return T;
}
// 查找指定数据元素(递归)
BSTree FindKey_recursion(BSTree T, TreeType key) {if (T == NULL) return NULL;if (key == T->data) return T;else if (key < T->data) return FindKey_recursion(T->rchild, key);else return FindKey_recursion(T->lchild, key);
}
// 删除指定元素的结点
BSTree DeleteData(BSTree T, TreeType element){BSTree parent_p, p, r;p = T; parent_p = NULL;// 查找找结点位置p while (p != NULL) {if (p->data == element) break;parent_p = p;if (p->data > element) p = p->lchild;else p = p->rchild;}if (p == NULL) return T;if (p->lchild == NULL) {if (parent_p == NULL) T = p->rchild;else if (parent_p->lchild == p) parent_p->lchild = p->lchild;else parent_p->rchild = p->rchild;}else {BSTree rr = p;for (r = p->rchild; r->lchild != NULL; r = r->lchild) rr = r;p->data = r->data;if (rr == p)p->rchild = r->rchild;else rr->lchild = r->rchild;p = r;}free(p);return T; // 若删除成功则返回该结点,否则返回NULL
}

四、运行结果

        main方法代码如下:

int main() {TreeType a[] = { 3, 2, 4, 5, 1 };BSTree T = NULL;for (int i = 0; i < 5; i++) T = InsertTree(a[i], T);printf("中序遍历: ");	InOrder(T);printf("\n先序遍历: ");	PreOrder(T);BSTree p = FindMin(T);if (p) 	printf("\n最大值: %d", p->data);else 	printf("\n未找到最大值");BSTree q = FindMax(T);if (q) 	printf("\n最小值: %d", q->data);else 	printf("\n未找到最小值");int find_data;printf("\n输入需查找的元素: ");scanf("%d", &find_data);p = FindKey_nonrecursion(T, find_data);if (p)	printf("找到指定元素: %d", p->data);else	printf("未找到指定元素");int delete_data;printf("\n输入需删除的元素: ");scanf("%d", &delete_data);BSTree r = DeleteData(T, delete_data);printf("删除后 中序遍历: "); InOrder(T);printf("\n删除后 先序遍历: "); PreOrder(T);
}

        运行结果如下:

 

五、源代码

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>/* 二叉排序树 */
typedef int TreeType;
typedef struct BSTNode {TreeType data;struct BSTNode* lchild, * rchild;
}*BSTree, BSTNode;BSTNode* CreateTreeNode(TreeType data); // 创建二叉树结点
BSTNode* InsertTree(TreeType data, BSTree root); // 插入元素
void PreOrder(BSTree T); // 先序遍历
void InOrder(BSTree T);	 // 中序遍历
BSTree FindMin(BSTree T);  // 查找最小值,返回该结点
BSTree FindMax(BSTree T);  // 查找最大值,返回该结点
BSTree FindKey_nonrecursion(BSTree T, TreeType key);	// 查找指定数据元素(非递归)
BSTree FindKey_recursion(BSTree T, TreeType key);		// 查找指定数据元素(递归)
BSTree DeleteData(BSTree T, TreeType element);			// 删除指定元素的结点// 创建二叉树结点
BSTNode* CreateTreeNode(TreeType data) {BSTNode* p = (BSTNode*)malloc(sizeof(struct BSTNode));p->lchild = p->rchild = NULL;p->data = data;return p;
}
// 插入元素
BSTNode* InsertTree(TreeType data, BSTree root){if (root == NULL) {root = CreateTreeNode(data);return root;}if (data < root->data)root->lchild = InsertTree(data, root->lchild);if (data > root->data)root->rchild = InsertTree(data, root->rchild);return root;
}
// 先序遍历
void PreOrder(BSTree T){if (T == NULL) return;printf("%d ", T->data);PreOrder(T->lchild);PreOrder(T->rchild);
}
// 中序遍历
void InOrder(BSTree T){if (T == NULL) return;InOrder(T->lchild);printf("%d ", T->data);InOrder(T->rchild);
}
// 查找最小值,返回该结点
BSTree FindMin(BSTree T){if (T == NULL) return NULL;BSTree min = T;while (min->lchild != NULL)min = min->lchild;return min;
}
// 查找最大值,返回该结点
BSTree FindMax(BSTree T){if (T == NULL) return NULL;BSTree max = T;while (max->rchild != NULL)max = max->rchild;return max;
}
// 查找指定数据元素(非递归)
BSTree FindKey_nonrecursion(BSTree T, TreeType key) {while (T != NULL && key != T->data) {if (T->data > key) T = T->lchild;else T = T->rchild;}return T;
}
// 查找指定数据元素(递归)
BSTree FindKey_recursion(BSTree T, TreeType key) {if (T == NULL) return NULL;if (key == T->data) return T;else if (key < T->data) return FindKey_recursion(T->rchild, key);else return FindKey_recursion(T->lchild, key);
}
// 删除指定元素的结点
BSTree DeleteData(BSTree T, TreeType element){BSTree parent_p, p, r;p = T; parent_p = NULL;// 查找找结点位置p while (p != NULL) {if (p->data == element) break;parent_p = p;if (p->data > element) p = p->lchild;else p = p->rchild;}if (p == NULL) return T;if (p->lchild == NULL) {if (parent_p == NULL) T = p->rchild;else if (parent_p->lchild == p) parent_p->lchild = p->lchild;else parent_p->rchild = p->rchild;}else {BSTree rr = p;for (r = p->rchild; r->lchild != NULL; r = r->lchild) rr = r;p->data = r->data;if (rr == p)p->rchild = r->rchild;else rr->lchild = r->rchild;p = r;}free(p);return T; // 若删除成功则返回该结点,否则返回NULL
}int main() {TreeType a[] = { 3, 2, 4, 5, 1 };BSTree T = NULL;for (int i = 0; i < 5; i++) T = InsertTree(a[i], T);printf("中序遍历: ");	InOrder(T);printf("\n先序遍历: ");	PreOrder(T);BSTree p = FindMin(T);if (p) 	printf("\n最大值: %d", p->data);else 	printf("\n未找到最大值");BSTree q = FindMax(T);if (q) 	printf("\n最小值: %d", q->data);else 	printf("\n未找到最小值");int find_data;printf("\n输入需查找的元素: ");scanf("%d", &find_data);p = FindKey_nonrecursion(T, find_data);if (p)	printf("找到指定元素: %d", p->data);else	printf("未找到指定元素");int delete_data;printf("\n输入需删除的元素: ");scanf("%d", &delete_data);BSTree r = DeleteData(T, delete_data);printf("删除后 中序遍历: "); InOrder(T);printf("\n删除后 先序遍历: "); PreOrder(T);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/8850.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

5个网站帮你找到免费优质的视频素材

5个免费可商用视频素材网站&#xff0c;建议收藏&#xff01; 潮点视频 https://shipin520.com/shipin-mb/all-def-267-all-all-all-all-all-0-1.html?from_code2510 潮点视频是一个提供优质高清、无水印的视频素材网站&#xff0c;站内有大量的AE模板、PR模板、实拍素材、视…

Dinky:问题总结

一、启动时指定flink版本&#xff0c;因为dinky本身也集成了部分flink ./auto.sh start 1.12 二、数据源管理新增mysql时的url jdbc:mysql://ip:3306/dinky?useUnicodetrue&characterEncodingutf8&useSSLfalse&autoReconnecttrue&failOverReadOnlyfalse 不要…

【Java高级语法】(十三)注解:解码程序设计中的元数据利器,在小小的@符里挖呀挖呀挖~用小小的注解做强大的开发...

Java高级语法详解之注解 1️⃣ 概念2️⃣ 优势和缺点3️⃣ 使用3.1 元注解3.2 自定义注解3.3 常用内置注解 4️⃣ 应用场景5️⃣ 底层原理6️⃣ 扩展&#xff1a;那些流行框架中的注解&#x1f33e; 总结 1️⃣ 概念 Java 注解&#xff08;Annotation&#xff09; 是Java语言中…

【Java】顺序表ArrayList

文章目录 一、顺序表二、ArrayList 的简介三、ArrayList 的使用3.1 构造方法3.2 常见操作3.3 遍历方法3.4 扩容机制 四、ArrayList 的模拟实现五、ArrayList 的使用案例5.1 扑克牌案例5.2 杨辉三角案例 六、ArrayList 存在的问题 一、顺序表 顺序表&#xff08;Sequential Lis…

js vuejs dagre-d3绘制流程图实用指南 有向图可视化

写在前面 之前有小伙伴问我如何使用 D3 在前端绘制流程图,今天在这里给安排上,与大家分享。 明确一点,只要你的数据计算能力足够强,使用原生D3绘制流程图绝对可以的,但是,为了让大家更容易上手,避免重复造轮子,给大家推荐一个专门绘制流程图的 D3 插件 dagre-d3。 首…

基于Flask+Bootstrap+机器学习的世界杯比赛预测系统

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

Springboot分布式事务

一、先了解什么是本地事务 1. 概念 本地事务是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器位于同一节点相同数据库上。 又称为传统事务。它是一个操作序列&#xff0c;这些操作要么都执行&#xff0c;要么都不执行&#xff0c;是一个不可分割的工作单位。例…

你真的不想知道怎么用ai绘画图片生成图片吗?

亲爱的二次元迷们&#xff0c;你是否曾经梦想过能够画出自己心中的二次元角色&#xff0c;让他们跃然纸上、生动活泼地展现在世人面前&#xff1f;但是&#xff0c;面对空白的画板和一支笔&#xff0c;我们有时会感到无从下手&#xff0c;毫无艺术细胞可言。不要失望&#xff0…

贵阳阿里云代理商:阿里云中国区副总裁李国欢:数字经济与实体经济如何融合

中国青年报客户端讯&#xff08;中青在线记者 于璧嘉&#xff09;6月21日&#xff0c;在第六届世界智能大会即将召开之际&#xff0c;阿里云中国区副总裁李国欢在接受媒体专访时表示&#xff1a;“数字经济已经成为社会生产力革命的一个重要生产要素。” 6月21日&#xff0c;阿…

如何批量将PDF转换为图片?

在生活工作中&#xff0c;我们会处理很多电子合同。这些电子合同一般是PDF格式&#xff0c;不但存储空间大&#xff0c;且预览起来不太便捷&#xff0c;需要我们转换为图片格式更方便预览。如果人工一一处理比较繁琐复杂&#xff0c;有没有什么方案可以快速将pdf转换为图片呢&a…

[STC32F12K54入门第三步]USART1+Modbus RTU从机

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、Modbus RTU是什么?二、Modbus RTU程序展示1.串口配置2.Timer定时器配置3.配置CRC16校验位和Modbus RTU发送函数4.主函数5.效果展示总结提示:以下是本篇文章正文内容,下面案例可供参考 一、…

基于Java连锁经营商业管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…