833系列——二叉排序树
考纲中,二叉排序树在“查找”章节,要求为:二叉排序树及其基本操作。
其基本操作有:查找操作,插入操作,删除操作
一:定义
二叉排序树(Binary Sort Tree),又称二叉查找树,它是一颗空树,或者是具有以下性质的二叉树:
若它的左子树不空,则左子树上所有结点的值均小于它的根节点的值。
若它的右子树不空,则右子树上所有结点的值均大于它的根节点的值。
它的左右子树也都是二叉排序树
二:首先定义一个二叉树的结构
1 struct BSTree 2 { 3 int data; 4 BSTree *lchild, *rchild; 5 BSTree(int d = 0, BSTree *l = NULL, BSTree *r = NULL) 6 { 7 data = d; 8 lchild = l; 9 rchild = r; 10 } 11 };
三:建立一个二叉排序树
二叉排序树的建立,其实就是由一个空树,一个一个的插入数据形成的,也就是需要插入操作
而在插入操作中,我们需要找到插入数据合适的位置,这里又可以看做是查找操作
插入操作有递归和循环两种写法
循环写法:
void insertTree1(BSTree* &root, int key) {if(root == NULL){BSTree *s = new BSTree(key);root = s;return;}BSTree *t = root;while(t->data != key){if(key > t->data && t->rchild != NULL)t = t->rchild;else if(key < t->data && t->lchild != NULL)t = t->lchild;else if(key > t->data && t->rchild == NULL){BSTree *s = new BSTree(key);t->rchild = s;}else if(key < t->data && t->lchild == NULL){BSTree *s = new BSTree(key);t->lchild = s;}} }
递归写法:
void insertTree2(BSTree* &root, int key) {if(root == NULL){BSTree *s = new BSTree(key);root = s;return;}if(key > root->data)insertTree2(root->rchild, key);elseinsertTree2(root->lchild,key); }
查找操作由插入操作简单修改得到,不再上代码
四:删除操作(重点)
删除节点有三种情况:
要删除的点为叶子节点,直接删除即可;
要删除的点只有左子树,或只有右子树,删除节点后,将左子树或右子树整体移动到被删除节点的位置即可;
要删除的节点即有左子树,又有右子树;
第一、二种情况可以合并为第二种,第三种情况比较复杂
根据二叉排序树的定义,节点删除后,这个位置应该由与它大小相邻的数代替,对于下面这张图:
假设要删除的节点为47,那么能够代替这个位置的就是37和48,可以发现,这两个数都有一个特点,37为47的左子树中的最右子树,48为47的右子树的最左子树
基于此可以这样做:假定每次都用较小的数来代替,也就是37,此时51这边整体就不用动了,只需要将37移动到47的位置,然后将37的整个左子树移动到37原来的位置
代码:
void Delete(BSTree* &node) {if(node->lchild == NULL){BSTree *temp = node;node = node->rchild;delete(temp);}else if(node->rchild == NULL){BSTree *temp = node;node = node->lchild;delete(temp);}else //用与该节点临近且小于的点代替 {BSTree *newnode = node->lchild;BSTree *temp = node;while(newnode->rchild != NULL){temp = newnode;newnode = newnode->rchild;}node->data = newnode->data;if(temp != node)temp->rchild = newnode->lchild;elsetemp->lchild = newnode->lchild;delete(newnode);} } void DeleteTree(BSTree* &root, int key) {if(root == NULL)return;if(key == root->data)Delete(root);else if(key > root->data)return DeleteTree(root->rchild, key);elsereturn DeleteTree(root->lchild, key); }
五:遍历及测试数据
建好二叉排序树后,使用中序遍历,即可得到一个排好序的数列
void InOrder(BSTree *root) {if(root != NULL){InOrder(root->lchild);cout << root->data << " ";InOrder(root->rchild);} }
测试数据
int main() {int a[12] = {29, 36, 62, 88, 58, 47, 35, 73, 51, 99, 37, 93};BSTree *root = NULL;for(int i=0; i<12; i++){insertTree2(root, a[i]);}InOrder(root);cout << endl;DeleteTree(root, 47);InOrder(root);return 0; }
转载于:https://www.cnblogs.com/flyuz/p/9484100.html
833系列——二叉排序树相关推荐
- 查找算法系列之复杂算法:二叉排序树BST
前面总结了顺序查找,二分查找,分块查找算法,此篇博文将详解介绍二叉排序算法(Binary Sort Tree). 在介绍二叉排序算法之前,首先介绍什么事二叉排序树(BST). 首先从二叉树讲起: 1. ...
- 【数据结构与算法】4.数据结构图文解析系列
数据结构图文解析系列 数据结构系列文章 数据结构图文解析之:数组.单链表.双链表介绍及C++模板实现 数据结构图文解析之:栈的简介及C++模板实现 数据结构图文解析之:队列详解与C++模板实现 数据结 ...
- 面试必会系列 - 2.1 MySQL知识点大汇总(基本架构,存储引擎,锁,事务,索引,B+树等等)
本文已收录至 Github(MD-Notes),若博客中图片模糊或打不开,可以来我的 Github 仓库,包含了完整图文:https://github.com/HanquanHq/MD-Notes,涵 ...
- java架构师进阶独孤九剑系列(一):数据结构与算法
" 架构师进阶系列之独孤九剑,这套秘籍如果你能完整学会,年薪至少60万起,今天是架构师进阶连载开启篇. Java程序员成长为架构师进阶步骤 未来我会用1-2个月在实战为大家讲解架构师的九大必 ...
- 查找算法系列之复杂算法:哈希查找
查找算法系列之复杂算法:哈希查找 眼下为止已经介绍了顺序查找.二分查找.分块查找.二叉排序树.见作者之前的文章: http://blog.csdn.net/u010025211/article/det ...
- 深度学习数字仪表盘识别_【深度学习系列】手写数字识别实战
上周在搜索关于深度学习分布式运行方式的资料时,无意间搜到了paddlepaddle,发现这个框架的分布式训练方案做的还挺不错的,想跟大家分享一下.不过呢,这块内容太复杂了,所以就简单的介绍一下padd ...
- Weka中数据挖掘与机器学习系列之Exploer界面(七)
不多说,直接上干货! Weka的Explorer(探索者)界面,是Weka的主要图形化用户界面,其全部功能都可通过菜单选择或表单填写进行访问.本博客将详细介绍Weka探索者界面的图形化用户界面.预处理 ...
- Mininet系列实验(六):Mininet动态改变转发规则实验
Mininet系列实验(六):Mininet动态改变转发规则实验 一. 实验目的 熟悉Mininet自定义拓扑脚本的编写: 熟悉编写POX脚本动态改变转发规则 二.实验原理 在SDN环境中,控制器可以 ...
- Java多线程系列--【JUC线程池 02】- 线程池原理(一)
参考:http://www.cnblogs.com/skywang12345/p/java_threads_category.html 概要 在前面一章"Java多线程系列--"J ...
最新文章
- 无法创建文件系统以及无法创建PV时怎么办?
- 可由一个尾指针唯一确定的链表有_2013-2014学年二学期数据结构期末考试试卷(3卷)...
- 机器学习常见损失函数
- OSPF——GRE Tunnel(含配置命令)详解
- k8s一个容器多个镜像_从零开始学K8s: 6.运行一个简单的容器
- 小米手表外观官宣:方表盘+黑银两色
- 《那些年啊,那些事——一个程序员的奋斗史》——81
- CentOS 7.2.5 安装 Redis 与 远程访问
- 15、AutoLayout使用UIScrollView
- 万字长文带你彻底搞懂什么是 DevOps
- mysql压缩修复数据库_压缩修复Access数据库
- 现代控制理论(机器人方向)习题与实践补充资料和复习说明(2019版)
- 工欲善其事,必先利其器-IntelliJ IDEA
- [Back-To-Back LC]背对背信用证
- django基于python的图书馆管理系统--python-计算机毕业设计
- 183 25用计算机算列竖式,新北师大四年级上册数学计算题
- ANSYS中关于质量矩阵 刚度矩阵的提取【1】
- 计算机英语中协议英语,计算机英语
- csdn活动:免费领取会员啦!
- 医疗门诊ERP系统源码