考纲中,二叉排序树在“查找”章节,要求为:二叉排序树及其基本操作。

其基本操作有:查找操作,插入操作,删除操作


一:定义

二叉排序树(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系列——二叉排序树相关推荐

  1. 查找算法系列之复杂算法:二叉排序树BST

    前面总结了顺序查找,二分查找,分块查找算法,此篇博文将详解介绍二叉排序算法(Binary Sort Tree). 在介绍二叉排序算法之前,首先介绍什么事二叉排序树(BST). 首先从二叉树讲起: 1. ...

  2. 【数据结构与算法】4.数据结构图文解析系列

    数据结构图文解析系列 数据结构系列文章 数据结构图文解析之:数组.单链表.双链表介绍及C++模板实现 数据结构图文解析之:栈的简介及C++模板实现 数据结构图文解析之:队列详解与C++模板实现 数据结 ...

  3. 面试必会系列 - 2.1 MySQL知识点大汇总(基本架构,存储引擎,锁,事务,索引,B+树等等)

    本文已收录至 Github(MD-Notes),若博客中图片模糊或打不开,可以来我的 Github 仓库,包含了完整图文:https://github.com/HanquanHq/MD-Notes,涵 ...

  4. java架构师进阶独孤九剑系列(一):数据结构与算法

    " 架构师进阶系列之独孤九剑,这套秘籍如果你能完整学会,年薪至少60万起,今天是架构师进阶连载开启篇. Java程序员成长为架构师进阶步骤 未来我会用1-2个月在实战为大家讲解架构师的九大必 ...

  5. 查找算法系列之复杂算法:哈希查找

    查找算法系列之复杂算法:哈希查找 眼下为止已经介绍了顺序查找.二分查找.分块查找.二叉排序树.见作者之前的文章: http://blog.csdn.net/u010025211/article/det ...

  6. 深度学习数字仪表盘识别_【深度学习系列】手写数字识别实战

    上周在搜索关于深度学习分布式运行方式的资料时,无意间搜到了paddlepaddle,发现这个框架的分布式训练方案做的还挺不错的,想跟大家分享一下.不过呢,这块内容太复杂了,所以就简单的介绍一下padd ...

  7. Weka中数据挖掘与机器学习系列之Exploer界面(七)

    不多说,直接上干货! Weka的Explorer(探索者)界面,是Weka的主要图形化用户界面,其全部功能都可通过菜单选择或表单填写进行访问.本博客将详细介绍Weka探索者界面的图形化用户界面.预处理 ...

  8. Mininet系列实验(六):Mininet动态改变转发规则实验

    Mininet系列实验(六):Mininet动态改变转发规则实验 一. 实验目的 熟悉Mininet自定义拓扑脚本的编写: 熟悉编写POX脚本动态改变转发规则 二.实验原理 在SDN环境中,控制器可以 ...

  9. Java多线程系列--【JUC线程池 02】- 线程池原理(一)

    参考:http://www.cnblogs.com/skywang12345/p/java_threads_category.html 概要 在前面一章"Java多线程系列--"J ...

最新文章

  1. 无法创建文件系统以及无法创建PV时怎么办?
  2. 可由一个尾指针唯一确定的链表有_2013-2014学年二学期数据结构期末考试试卷(3卷)...
  3. 机器学习常见损失函数
  4. OSPF——GRE Tunnel(含配置命令)详解
  5. k8s一个容器多个镜像_从零开始学K8s: 6.运行一个简单的容器
  6. 小米手表外观官宣:方表盘+黑银两色
  7. 《那些年啊,那些事——一个程序员的奋斗史》——81
  8. CentOS 7.2.5 安装 Redis 与 远程访问
  9. 15、AutoLayout使用UIScrollView
  10. 万字长文带你彻底搞懂什么是 DevOps
  11. mysql压缩修复数据库_压缩修复Access数据库
  12. 现代控制理论(机器人方向)习题与实践补充资料和复习说明(2019版)
  13. 工欲善其事,必先利其器-IntelliJ IDEA
  14. [Back-To-Back LC]背对背信用证
  15. django基于python的图书馆管理系统--python-计算机毕业设计
  16. 183 25用计算机算列竖式,新北师大四年级上册数学计算题
  17. ANSYS中关于质量矩阵 刚度矩阵的提取【1】
  18. 计算机英语中协议英语,计算机英语
  19. csdn活动:免费领取会员啦!
  20. 医疗门诊ERP系统源码

热门文章

  1. 3D空间的指定起点和终点的抛体运动
  2. 【Java】单词倒序输出
  3. Google 在开源上的贡献
  4. SSH 中从后台传值到前台JSP,传不过去问题
  5. iOS开发-开发总结(七)
  6. 打造基于大并发通信技术及大数据技术的O2O系统
  7. JavaScript:动态选中CheckBox
  8. 指南--安装带GTK前端的 F-Prot(杀毒)
  9. Linkify 添加链接
  10. GitHub 回滚操作