数据结构与算法——二叉查找树类的C++实现

C++ 实现二叉排序树(二叉查找树) C++ 实现二叉排序树(二叉查找树) 二叉排序树( Binary Sort Tree),又称为二叉查找树。它或者是一棵空树,或者是具有下列性质的二叉树。 若它的左子树不空,则左子树上所有结点的值均小于它的根结构的值; 若它的右子树不空,则右子树上所有结点的值均大于宫的根结点的值; 它的左、右子树也分别为二叉排序树。 查找、插入与生成操作 #include <iostream&... 阅读详情
二叉树的平均深度为O(logN);
二叉查找树在二叉树的基础上,增加的性质为:对于树中每一个结点X,它的左子树中所有项的值小于X中的项,而它的右子树中所有项的值大于X中的项。

该二叉查找树结点的数据结构:


struct BinaryNode{
    Comparable element;//结点的值
    BinaryNode * left;//结点的左孩子
    BinaryNode * right;//结点的右孩子
    int num;//相同值的结点出现的次数,如果不考虑重复元素的话,该成员可以省去
    BinaryNode(const Comparable & e, BinaryNode* lt, BinaryNode* rt, int n):element(e), left(lt), right(rt), num(n){}
};

该结点数据结构其实是一个结点类。

该二叉查找树的主要成员函数:

BinarySearchTree(){root = NULL;}//构造函数
BinarySearchTree(vector<int> & v);//构造函数
BinarySearchTree(const BinarySearchTree & rhs);//复制构造函数
const BinarySearchTree & operator=(const BinarySearchTree & rhs);//赋值运算符重载
~BinarySearchTree();//析构函数

void preOrderPrintTree() const;//从小到大打印该二叉查找树
void inOrderPrintTree() const;//从大到小打印该二叉查找树

Comparable findMin() const;//查找最小值
Comparable findMax() const;//查找最大值
bool contains(const Comparable & x) const;//判断该二叉查找树是否包含值为x的结点
bool isEmpty() const;//判断该二叉查找树是否为空 
void makeEmpty();//清空该二叉查找树

void insert(const Comparable & x);//插入结点
void remove(const Comparable & x);//移除结点值为x的结点

主要成员函数介绍:

void remove(const Comparable & x);//移除结点值为x的结点

/****************************************************************
*   函数名称:remove(const Comparable & x) 
*   功能描述: 移除结点
*   参数列表: x -- 要移除的结点的值 
*   返回结果:void
*****************************************************************/
template<typename Comparable>
void BinarySearchTree<Comparable>::remove(const Comparable & x)
{
    remove(x, root);    
}

template<typename Comparable>
void BinarySearchTree<Comparable>::remove(const Comparable & x, BinaryNode * &t) const
{
    if(t == NULL)
        return;

    if(x < t->element)
        remove(x, t->left);
    else if(x > t->element)
        remove(x, t->right);
    else if((t->left != NULL) && (t->right != NULL)){//该结点有两个儿子的时候,将该结点右子树的最小结点覆盖该结点的值,然后再删除那个最小结点
        t->element = findMin(t->right);
        remove(t->element, t->right);
    }
    else {//该结点只有一个儿子的时候,将儿子放在当前结点的位置。用另一个指针保存当前结点,然后删除该结点;此时也包括该结点为叶子结点的情况
        BinaryNode * oldCurrentNode = t;
        t = (t->left == NULL) ? t->right : t->left;
        delete oldCurrentNode;
    }
}






下面的main函数是对remove成员函数的测试,用的就是上面两个图:

int main()
{
    BinarySearchTree<int> tree;
    tree.insert(6);
    tree.insert(2);
    tree.insert(1);
    tree.insert(4);
    tree.insert(3);
    tree.insert(8);

    tree.preOrderPrintTree();
    tree.remove(4);
    tree.preOrderPrintTree();

    BinarySearchTree<int> tree2;
    tree2.insert(6);
    tree2.insert(2);
    tree2.insert(1);
    tree2.insert(5);
    tree2.insert(3);
    tree2.insert(4);
    tree2.insert(8);
    tree2.preOrderPrintTree();
    tree2.remove(2);
    tree2.preOrderPrintTree();


    return 0;
}


下面是该二叉查找树类的源代码:


/*******
使用C++实现二叉查找树(二叉搜索树)的创建、查找、插入、删除等操作 使用C++实现常见的关于二叉查找树的操作接口 阅读详情

相关推荐

Java实现二叉树(一):二叉查找树的实现

Java实现二叉树(一):二叉查找树的实现    数据结构+算法=程序,这是共识,是真理,还是学生时代卷子中的考点。但大多数程序员往往缺乏数据结构和算法的知识,或是根本没有学过,或是学过,但在工作时频繁地与业务逻辑打交道,也就逐渐忘记了有这么一回事。    话不多说,直接开始吧,本文将介绍二叉树的基本概念,以及平衡二叉树增删改查节点的实现,由于网上关于数据结构的资料,C++相对居多,而本身作为一个...

that_is_cool的博客 7083

自由曲面与衍射光学元件DOE:从基础理论到工业应用的全景解析

本文全景解析了自由曲面与衍射光学元件的核心理论与工业应用。文章深入探讨了自由曲面在非对称光学设计中的灵活性及其数学描述与制造挑战,并阐述了衍射光学元件通过微纳结构进行波前相位调制的原理与多样化功能。两者与经典光学互补融合,共同构成了高端成像、智能照明、激光加工及AR/VR等前沿领域的底层技术支柱。

devops8pract的博客 390

opencv图像去畸变

opencv图像去畸变

智能机器人产学研基地 4862

qt5.14.2+vs2019配置msvc2017编译器

qt5.14.2+vs2019配置msvc2017编译器 在使用qt编译程序时此前一直使用的是自带的MinGW 32-bit和64-bit,现在想使用msvc编译器。本次使用的是qt5.14.2,vs2019,需要配置msvc2017的32-bit和64-bit编译器。 1、首先安装好qt5.14.2和vs2019,其次在visual studio installer选择修改,然后选择msvc2017对应的组件,本次安装的是这两个 2、打开qt creator的工具–选项–kits–编译器,选择Manu

bangtanhui的博客 1万+

玩转Docker | 使用Docker部署MediaCMS内容管理系统

玩转Docker | 使用Docker部署MediaCMS内容管理系统

qq_59334230的博客 2916

15、SQL Server查询优化与CPU负载管理

本文深入探讨了SQL Server查询优化与CPU负载管理的关键技术,包括强制连接类型的使用、键查找问题的解决、索引设计的最佳实践、高CPU负载的排查与优化,以及并行性的利弊与调整策略。通过优化查询逻辑、合理设计索引、监控与管理CPU资源,可以显著提升SQL Server的性能和稳定性。适用于数据库开发人员和DBA进行性能调优参考。

pz8901234的博客 76

Deepfake检测模型-PyDeepFakeDet项目复现实验报告-深度学习

该实验是对于https://github.com/wangjk666/PyDeepFakeDet模型的复现。PyDeepFakeDet 是一款集成的、可扩展的 Deepfake 检测工具。目标是提供最先进的 Deepfake 检测模型以及用于在常用 Deepfake 数据集上训练和评估新模型的接口。

一位不是很硕的鉴伪方向硕士 5494

Tmux学习总结

Tmux 重要概念 使用 Tmux 的时候千万不要去背指令,所有的指令都可以在 .tmux.conf 配置文件中绑定自己顺手的快捷键,也可以配置开启鼠标。 这个是我的配置文件:https://github.com/zuorn/tmux.conf 在Tmux逻辑中,需要分清楚Server > Session > Window > Pane这个大小和层级顺序是极其重要的,直接关系到工作效率: Server:是整个tmux的后台服务。有时候更改配置不生效,就要使用tmux kill-

满目星辰 573

python中视觉检测怎么将多个面拍照的图片合成一个3d图像,用什么技术或者什么模型?

🏆本文收录于 《全栈Bug调优(实战版)》 专栏,该专栏专注于分享我在真实项目开发中遇到的各类疑难Bug及其深层成因,并系统提供高效、可复现的解决思路和实操方案。无论你是刚入行的新手开发者,还是拥有多年项目经验的资深工程师,本专栏都将为你提供一条系统化、高质量的问题排查与优化路径,助力你加速成长,攻克技术壁垒,迈向技术价值最大化与职业发展的更高峰🚀!

**My Coding Family** 706

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

上一篇: C/C++—— 默认构造函数是否会执行
下一篇: 数据结构与算法——AVL树类的C++实现
readyao
博客等级 码龄11年 243粉丝 163原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值