【C++】实现一个二叉搜索树

 


目录

二叉搜索树的概念

1.结点定义

2.构造、析构、拷贝构造、赋值重载

3.插入、删除、查找、排序

3.1插入

3.2插入递归版

3.3查找指定值

3.3查找指定值递归版

3.4中序遍历

3.5删除

最后


二叉搜索树的概念

二叉搜索树又称为二叉排序树或二叉查找树,它或者是一棵空树,或者是具有以下性质的二叉树:

  • 非空左子树上所有结点的值都小于根结点的值。
  • 非空右子树上所有结点的值都大于根结点的值。
  • 左右子树都是二叉搜索树。

1.结点定义

template<class K>
struct BSTreeNode
{BSTreeNode<K>* _left;BSTreeNode<K>* _right;K _key;BSTreeNode(const K& key):_key(key),_left(nullptr),_right(nullptr){}
};

2.构造、析构、拷贝构造、赋值重载

    //构造函数BSTree(): _root(nullptr){}//析构函数~BSTree(){//递归删除Destroy(_root);_root = nullptr;}//拷贝构造BSTree(const BSTree<K>& t){//递归去拷贝_root = Copy(t._root);}//赋值重载BSTree<K>& operator=(BSTree<K> t)//注意这里传参,传值传参,默认已经拷贝构造新的一份了{swap(_root, t._root);//这里直接交换return 就好return *this;}Node* Copy(Node* root){//前序遍历if (root == nullptr){return nullptr;}Node* newRoot = new Node(root->_key);//建立联系,不是简单的调用newRoot->_left = Copy(root->_left);newRoot->_right = Copy(root->_right);return newRoot;}void Destroy(Node* root){if (root == nullptr){return;}Destroy(_root->_left);Destroy(_root->_right);delete(root);}

3.插入、删除、查找、排序

3.1插入

bool Insert(const K& key){//不允许相等数据插入版本,减少冗余//空树if (_root == nullptr){_root = new Node(key);return true;}//正常插入Node* cur = _root;Node* parent = _root;while (cur != nullptr){if (key > cur->_key){parent = cur;cur = cur->_right;}else if (key < cur->_key){parent = cur;cur = cur->_left;}else{return false;}}cur = new Node(key);if (key > parent->_key){parent->_right = cur;}else{parent->_left = cur;}return true;}

3.2插入递归版

bool InsertR(const K& key)//注意参数{return _InsertR(_root, key);}
bool _InsertR(Node* &root,const K& key){if (root == nullptr){root = new Node(key);return true;}if (root->_key > key){return _InsertR(root->_left, key);}else if (root->_key < key){return _InsertR(root->_right, key);}else{//相等return false;}}

3.3查找指定值

bool Find(const K& key){Node* cur = _root;while (cur!=nullptr){if (cur->_key > key){cur = cur->_left;}else if (cur->_key < key){cur = cur->_right;}else{return true;}}return false;}

3.3查找指定值递归版

    bool FindR(const K& key){return _FindR(_root, key);}bool _FindR(Node*& root, const K& key){if (root == nullptr){return false;}if (root->_key == key){return true;}if (root->_key > key){return _FindR(root->_left, key);}else {return _FindR(root->_right, key);}}

3.4中序遍历

    void InOrder(){_InOrder(_root);}void _InOrder(Node* root){if (root == nullptr){return;}_InOrder(root->_left);cout << root->_key << " ";_InOrder(root->_right);}

3.5删除

bool Erase(const K& key){Node* cur = _root;Node* parent = _root;while (cur){//找到节点if (cur->_key > key){parent = cur;cur = cur->_left;}else if (cur->_key < key){parent = cur;cur = cur->_right;}else{//找到了//删除没有孩子或者只有一种孩子的节点//这个是普通节点if (cur->_right == nullptr){if (parent->_left == cur){parent->_left = cur->_left;}if (parent->_right == cur){parent->_right = cur->_left;}if(parent==cur)//是根结点{parent = parent->_left;}delete(cur);return true;}else if(cur->_left==nullptr){if (parent->_left == cur){parent->_left = cur->_right;}if (parent->_right == cur){parent->_right = cur->_right;}if (parent == cur)//是根结点{parent = parent->_right;}delete(cur);return true;}else{//左右都不为空//替换法删除,找右子树的最小值Node* miniright = cur->_right;Node* minirightp = cur;while (miniright->_left != nullptr){minirightp = miniright;miniright = miniright->_left;}cur->_key = miniright->_key;if (minirightp->_left == miniright){minirightp->_left = miniright->_right;}if (minirightp->_right == miniright){minirightp->_right = miniright->_right;}delete(miniright);return true;}}}return false;}


最后

加油

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

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

相关文章

Markdown:简洁高效的文本标记语言

引言 在当今信息爆炸的时代&#xff0c;我们需要一种简洁、高效的文本标记语言来排版和发布内容。Markdown应运而生&#xff0c;它是一种轻量级的文本标记语言&#xff0c;以其简单易学、易读易写的特点&#xff0c;成为了广大写作者的首选工具。本文将介绍Markdown的语法优缺…

设计模式(行为型模式)观察者模式

目录 一、简介二、观察者模式2.1、事件接口及其实现2.2、观察者接口及其实现2.3、主题接口及其实现2.4、使用 三、优点与缺点 一、简介 观察者模式&#xff08;Observer Pattern&#xff09;是一种行为设计模式&#xff0c;它定义了一种一对多的依赖关系&#xff0c;当一个对象…

Composition Local

1.显示传参 package com.jmj.jetpackcomposecompositionlocalimport org.junit.Testimport org.junit.Assert.*/*** 显示传参*/ class ExplicitText {private fun Layout(){var color:String "黑色";//参数需要通过层层传递&#xff0c;比较繁琐Text(color)Grid(c…

B2081 与 7 无关的数(洛谷)

题目描述 一个正整数&#xff0c;如果它能被 7 整除&#xff0c;或者它的十进制表示法中某一位上的数字为 7&#xff0c;则称其为与 7 相关的数。现求所有小于等于 n(n<100) 与 7 无关的正整数的平方和。 输入格式 输入为一行&#xff0c;正整数 n(n<100)。 输出格式…

Redis篇之过期淘汰策略

一、数据的过期策略 1.什么是过期策略 Redis对数据设置数据的有效时间&#xff0c;数据过期以后&#xff0c;就需要将数据从内存中删除掉。可以按照不同的规则进行删除&#xff0c;这种删除规则就被称之为数据的删除策略&#xff08;数据过期策略&#xff09;。 2.过期策略-惰…

rem基础+媒体查询+Less基础

一&#xff0c;rem基础 二&#xff0c;媒体查询 2.1什么是媒体查询 2.2语法规范 2.3媒体查询rem实现元素动态大小的变化 2.4 引入资源&#xff08;理解&#xff09; 三&#xff0c;Less基础 1 维护css的弊端 2 Less介绍 3 Less变量 变量命名规范 4 Less嵌套 5 Less…

2021年通信工程师初级 实务 真题

文章目录 一、第1章 现代通信网概述&#xff0c;通信网的定义。第10章 通信业务&#xff0c;普遍服务原则10.2.4 通信行业的发展趋势&#xff08;六化&#xff09; 二、第2章 传输网SDH帧结构SDH线路保护倒换&#xff0c;“11 保护”和“1:1保护”波长值λc/f&#xff0c;中心频…

思科模拟器命令大全详解

以下是常用的Cisco模拟器&#xff08;如Packet Tracer&#xff09;中的命令大全详解&#xff1a; 1. 基础命令 - enable&#xff1a;进入特权模式&#xff08;enable mode&#xff09;。 - configure terminal&#xff1a;进入全局配置模式&#xff08;global configuration …

鸿蒙开发-UI-图形-图片

鸿蒙开发-UI-组件 鸿蒙开发-UI-组件2 鸿蒙开发-UI-组件3 鸿蒙开发-UI-气泡/菜单 鸿蒙开发-UI-页面路由 鸿蒙开发-UI-组件导航-Navigation 鸿蒙开发-UI-组件导航-Tabs 文章目录 一、基本概念 二、图片资源加载 1. 存档图类型数据源 2.多媒体像素图 三、显示矢量图 四、图片…

LLM大语言模型(六):RAG模式下基于PostgreSQL pgvector插件实现vector向量相似性检索

目录 HightLightMac上安装PostgreSQLDBever图形界面管理端创建DB 使用向量检索vector相似度计算近似近邻索引HNSW近似近邻索引示例 HightLight 使用PostgreSQL来存储和检索vector&#xff0c;在数据规模非庞大的情况下&#xff0c;简单高效。 可以和在线业务共用一套DB&#…

在 Ubuntu 22.04 上安装 Django Web 框架的方法

简介 Django 是一个功能齐全的 Python Web 框架&#xff0c;用于开发动态网站和应用程序。使用 Django&#xff0c;您可以快速创建 Python Web 应用程序&#xff0c;并依赖框架来完成大部分繁重的工作。 在本指南中&#xff0c;您将在 Ubuntu 22.04 服务器上启动 Django。安装…

【动态规划】【C++算法】2188. 完成比赛的最少时间

作者推荐 【动态规划】【前缀和】【C算法】LCP 57. 打地鼠 本文涉及知识点 动态规划汇总 LeetCode2188. 完成比赛的最少时间 给你一个下标从 0 开始的二维整数数组 tires &#xff0c;其中 tires[i] [fi, ri] 表示第 i 种轮胎如果连续使用&#xff0c;第 x 圈需要耗时 fi…

Xshell

更改背景颜色 多个会话同时执行命令 查看 -> 撰写 -> 撰写窗格

【YOLO系列详解——超详细】

YOLO系列详解 1. 介绍2. YOLO原理3. YOLO版本4. 在开发实践中使用YOLO 1. 介绍 YOLO&#xff08;You Only Look Once&#xff09;是一种使用深度学习实现的端到端的目标检测系统&#xff0c;YOLO系列模型以其检测速度快、实时性高而闻名&#xff0c;并且能在图像中同时预测多个…

【Spring】GoF 之工厂模式

一、GoF 23 设计模式简介 设计模式&#xff1a;一种可以被重复利用的解决方案 GoF&#xff08;Gang of Four&#xff09;&#xff0c;中文名——四人组 《Design Patterns: Elements of Reusable Object-Oriented Software》&#xff08;即《设计模式》一书&#xff09;&…

MySQL 的Sql脚本是如何被编译的

MySQL是一个关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;它使用SQL&#xff08;Structured Query Language&#xff0c;结构化查询语言&#xff09;作为其主要的查询语言。在MySQL中运行一个SQL脚本时&#xff0c;MySQL实际上并不会像传统的编程语言那样将S…

企业级人脸属性检测解决方案

在当今数字化、智能化的时代背景下&#xff0c;人脸识别技术已经成为众多行业不可或缺的一部分。美摄科技&#xff0c;作为人脸识别技术的领先者&#xff0c;为企业提供了一整套先进且高效的人脸属性检测解决方案。 美摄科技的人脸属性检测解决方案&#xff0c;基于深度学习算…

使用深度学习对网络摄像头图像进行分类

目录 加载相机和预训练网络 对相机快照进行分类 连续对相机图像进行分类 显示排名靠前的预测值 连续分类图像并显示排名靠前的预测值 另请参阅 此示例说明如何使用预训练的深度卷积神经网络 GoogLeNet 实时对来自网络摄像头的图像进行分类。 使用 MATLAB、普通的…

Vue-Vue3 集成编辑器功能

1、安装依赖 编辑器插件需要安装 wangeditor/editor 和 wangeditor/editor-for-vue 两个插件 npm install wangeditor/editor --savevue3运行如下命令安装 npm install wangeditor/editor-for-vuenext --savevue2运行如下命令安装 npm install wangeditor/editor-for-vue -…

Java强训day15(选择题编程题)

选择题 自连接使用一张表编程题 题目1 import java.util.Scanner;public class Main { public static int res(int n) {StringBuffer s new StringBuffer();while(n!0) {s.append(n%2);n/2;}int sum 0;String ss s.reverse().toString();for(int i0;i<ss.length()…