C++深入细致探究二叉搜索树
作者:Suk-god 发布时间:2021-12-31 00:09:24
1、二叉搜索树的概念
 二叉搜索树又称二叉排序树,它可以是一颗空树,亦可以是一颗具有如下性质的二叉树:
  ①若根节点的左子树不为空,则左子树上的所有节点的值域都小于根节点的值
  ②若根节点的右子树不为空,则右子树上的所有节点的值域都大于根节点的值
  ③根节点的左右子树分别也是一颗二叉搜索树
例如下面的这棵二叉树就是一棵二叉搜索树:
注意:判定一棵二叉树是否为二叉搜索树一定要紧扣二叉搜索树的概念~
2、二叉搜索树的操作
声明:该文章讨论的是二叉搜索树中节点值唯一的情况。
二叉搜索树的查找
对于查找部分,充分利用二叉搜索树的特性,即右子树的value 大于根节点,左子树的value小于根节点。
例如:查找下图中的红色方框中的节点
以6对应的节点为列,查找过程主要经历如下几个步骤:
  ①6与根节点5比较,6 > 5,因此到5的右子树查找
  ①6与根节点7比较,6 < 7,因此到7的左子树查找
  ①6与根节点6比较,6 == 6,此时查找成功!
总结基本步骤:
若根节点不为空:
  如果根节点的key == 查找的key----->返回true
  如果根节点的key > 查找的key----->转到根节点的右子树查找
  如果根节点的key < 查找的key----->转到根节点的左子树查找
否则(根节点为空了),直接返回false,表示树中不存在要查找的key
二叉搜索树的插入
主要分两大类的情况进行讨论:
1、树为空,直接插入
如下图所示:
2、树不空
①按照二叉搜索树的性质查找插入的位置
②插入新的节点
e.g:在下面的二叉搜索树中插入-1
第一步,查找插入位置:
 注意:要标记当前访问的节点的双亲,否则,就算找到了插入位置,由于无法访问其双亲,也是无法进行插入的。这里使用parent来标记当前访问节点的双亲节点。
具体过程如下图:
第二步,插入新节点
判断待插入节点(node)的值与parent标记的节点值的大小关系
if(node->value < parent->value)//新节点作为parent的左孩子
{
parent->left = node;
}
else//新节点作为parent的右孩子
{
parent->right = node;
}
来源:https://blog.csdn.net/Suk_god/article/details/124906501


猜你喜欢
- 前言本文主要给大家介绍了关于Spring Boot应用事件监听的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧1.
- 首先给大家展示下运行效果图:由于通讯录在手机里是以数据库贮存的 所以我们可以通过一个方法context.getContentResolver
- 由于考虑到数据库的安全性,不被轻易SQL注入,执行查询语句时,一般不使用直接拼接的语句,而是使用参数传递的方法。然后在使用参数传递的方法中时
- 即只能在组件布局代码后,或者在组件的前面添加注释。#注释格式:Android的XML文件注释一般采用 <!--注释内容 -->的
- 本文实例讲述了C#编程调用Cards.dll实现图形化发牌功能。分享给大家供大家参考,具体如下:using System;using Sys
- 项目信息使用SpringBoot web框架,版本号 2.7.10<dependency><groupId>org.
- 面向方面编程(Aspect Oriented Programming,简称AOP)是一种声明式编程(Declarative Programm
- 一、项目前提1、购物车并不是一直放数据库2、选择使用的技术:session:(购物车项目使用session)好处:快(放在内存当中),存对象
- 图的实际应用在现实生活中,有许多应用场景会包含很多点以及点点之间的连接,而这些应用场景我们都可以用即将要学习的图这种数据结构去解决。地图:我
- 先说一下对异步和同步的理解:同步调用:调用方在调用过程中,持续等待返回结果。异步调用:调用方在调用过程中,不直接等待返回结果,而是执行其他任
- 本文在实现雪花效果的基础上,根据漫天飞舞雪花,实现下雨天场景的效果,使用eclipse android 版本,具体内容如下雪花效果图:具体代
- 详解Kotlin:forEach也能break和continue这样的问题。也就是说,他们想用forEach而不是for循环,因为这很fp,
- 本文实例讲述了Android检查手机网络状态及网络类型的方法。分享给大家供大家参考。具体分析如下://judge network statu
- 不想废话,直接写了!因为是留给自己做随笔的,所以大神们看到别喷…… 1.必须有微信公众账号 2.你也可以申请测试微信号,
- 本文实例讲述了Android判断设备网络连接状态及判断连接方式的方法。分享给大家供大家参考,具体如下:在Android开发过程中,对于一个需
- 于是提出了kill process的方法,目前我见过的方法多是用进程创建时间筛选excel.exe进程,然后kill 。这样的方法
- 基本用法不说了,网上例子很多,这里主要介绍下比较特殊情况下使用的方法。1. 分组有的时候,我们对一个实体类需要有多中验证方式,在不同的情况下
- 本文实例讲述了C#图像处理之边缘检测(Sobel)的方法。分享给大家供大家参考。具体如下://定义sobel算子函数private stat
- 简介Java内存模型是在硬件内存模型上的更高层的抽象,它屏蔽了各种硬件和操作系统访问的差异性,保证了Java程序在各种平台下对内存的访问都能
- 前言在 App 开发过程中,ListView 是 比较很常见的控件,用来处理 列表类的数据展示。当然 Flutter 也是支持的,由于 Fl