C++数据结构之搜索二叉树的实现

yizhihongxing

C++数据结构之搜索二叉树的实现

搜索二叉树(Binary Search Tree, BST)是一种常见的数据结构,它支持快速地查找、插入和删除元素。本文将详细讲述如何用C++实现搜索二叉树。

一、搜索二叉树的定义

搜索二叉树是一种二叉树,它满足以下性质:

  • 对于任意一个节点,其左子树中的所有节点都小于它,其右子树中的所有节点都大于它;
  • 每个节点的左右子树也都是搜索二叉树。

二、搜索二叉树的实现

搜索二叉树的实现可以分为两部分:节点定义和操作实现。下面分别介绍。

2.1 节点定义

我们可以用如下代码定义一个搜索二叉树节点:

class TreeNode {
public:
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int v) : val(v), left(nullptr), right(nullptr) {}
};

其中,val表示节点的值,left和right分别指向左右子树的指针。

2.2 操作实现

搜索二叉树的基本操作包括插入、删除和查找。下面分别介绍。

2.2.1 插入操作

插入操作比较简单,实现如下:

void insert(TreeNode*& root, int val) {
    if (root == nullptr) {
        root = new TreeNode(val);
        return;
    }
    if (val < root->val) {
        insert(root->left, val);
    } else {
        insert(root->right, val);
    }
}

其中,root是搜索二叉树的根节点,val是要插入的值。

2.2.2 删除操作

删除操作有三种情况,分别是:

  • 删除的节点没有左右子节点,直接删除即可;
  • 删除的节点只有一个子节点,将其子节点提上来即可;
  • 删除的节点有两个子节点,找到其右子树中最小的节点,用它来替代删除的节点。

实现如下:

void remove(TreeNode*& root, int val) {
    if (root == nullptr) {
        return;
    }
    if (val < root->val) {
        remove(root->left, val);
    } else if (val > root->val) {
        remove(root->right, val);
    } else {
        if (root->left == nullptr && root->right == nullptr) {
            delete root;
            root = nullptr;
        } else if (root->left == nullptr) {
            TreeNode* temp = root;
            root = root->right;
            delete temp;
        } else if (root->right == nullptr) {
            TreeNode* temp = root;
            root = root->left;
            delete temp;
        } else {
            TreeNode* min_node = root->right;
            while (min_node->left != nullptr) {
                min_node = min_node->left;
            }
            root->val = min_node->val;
            remove(root->right, min_node->val);
        }
    }
}

其中,root是搜索二叉树的根节点,val是要删除的值。

2.2.3 查找操作

查找操作也比较简单,实现如下:

bool find(TreeNode* root, int val) {
    if (root == nullptr) {
        return false;
    }
    if (root->val == val) {
        return true;
    }
    if (val < root->val) {
        return find(root->left, val);
    } else {
        return find(root->right, val);
    }
}

其中,root是搜索二叉树的根节点,val是要查找的值。

三、示例说明

下面给出两个示例说明,以展示搜索二叉树的使用方法。

3.1 示例一:插入和查找操作

TreeNode* root = nullptr;
insert(root, 5);
insert(root, 3);
insert(root, 7);
insert(root, 1);
insert(root, 9);
cout << find(root, 7) << endl; // 输出1
cout << find(root, 10) << endl; // 输出0

首先创建一个空的搜索二叉树,然后分别插入5、3、7、1、9这5个节点。最后查找7和10,结果分别为1和0。

3.2 示例二:删除操作

TreeNode* root = nullptr;
insert(root, 5);
insert(root, 3);
insert(root, 7);
insert(root, 1);
insert(root, 9);
remove(root, 7);
remove(root, 10);
cout << find(root, 7) << endl; // 输出0
cout << find(root, 9) << endl; // 输出1

首先创建一个搜索二叉树,并插入5、3、7、1、9这5个节点。然后从中删除7和10,分别对应已存在和不存在的节点。最后查找7和9,结果分别为0和1。

四、总结

本文详细讲述了如何用C++实现搜索二叉树,在节点定义和操作实现两方面进行了详细说明,并通过示例说明展示了搜索二叉树的基本使用方法。希望本文能够对大家学习搜索二叉树有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++数据结构之搜索二叉树的实现 - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • 【牛客小白月赛70】A-F题解【小d和超级泡泡堂】【小d和孤独的区间】【小d的博弈】【小d和送外卖】

    比赛传送门:https://ac.nowcoder.com/acm/contest/53366 难度适中。 ? 作者:Eriktse? 简介:19岁,211计算机在读,现役ACM银牌选手?力争以通俗易懂的方式讲解算法!❤️欢迎关注我,一起交流C++/Python算法。(优质好文持续更新中……)?? 阅读原文获得更好阅读体验:https://www.erikt…

    算法与数据结构 2023年4月17日
    00
  • Python描述数据结构学习之哈夫曼树篇

    Python描述数据结构学习之哈夫曼树篇攻略 简介 本篇攻略旨在介绍哈夫曼树的概念、构建方法和应用场景,并结合Python代码进行演示。 哈夫曼树概念 哈夫曼树(Huffman Tree)又称最优树,它是一种带权路径长度最短的树。所谓带权路径长度,就是每个节点的权值乘以其到根节点的路径长度(即树的层数)之和。哈夫曼树广泛应用于数据压缩领域。 哈夫曼树构建方法…

    数据结构 2023年5月17日
    00
  • C++实现KDTree 附完整代码

    对于“C++实现KDTree 附完整代码”的攻略,我会分为以下几个部分进行讲解: KDTree的基本概念和算法原理 KDTree的实现思路和整体代码结构 KDTree在实际应用中的应用场景 两个示例应用说明 KDTree基本概念和算法原理 KDTree全称是K-Dimensional Tree,即K维树,是一种便于高维空间数据检索的数据结构。其基本思路是对于…

    数据结构 2023年5月17日
    00
  • 深入PHP中的HashTable结构详解

    深入PHP中的HashTable结构详解 在PHP中,HashTable是一种基础数据结构,常用于存储对象的属性和方法等各种数据,本篇攻略将深入介绍HashTable的实现原理和应用。 HashTable的实现原理 HashTable并不是一种单一的数据结构,它可以根据不同的需求来采用不同的实现方式。在PHP中,我们经常使用的是基于链表的实现方式,也就是链式…

    数据结构 2023年5月17日
    00
  • 数据结构与算法大作业:走迷宫程序(C语言,DFS)(代码以及思路)

    好家伙,写大作业,本篇为代码的思路讲解   1.大作业要求 走迷宫程序 问题描述: 以一个 m * n 的长方阵表示迷宫, 0和1分别表示迷宫的通路和障碍。 设计一个程序, 对任意设定的迷宫, 求出一条从入口到出口的通路, 或得出没有通路的结论。 基本要求: (1) 实现一个以链表做存储的栈类型, 然后编写一个求解迷宫的非递归程序。 求的通路以三元组(i, …

    算法与数据结构 2023年5月9日
    00
  • 一文学会数据结构-堆

    一文学会数据结构-堆 什么是堆 在计算机科学中,堆是一个特殊的树状数据结构。堆通常有如下几个特性: 堆是完全二叉树; 堆中每个节点的值都大于或等于(小于或等于)其子节点的值,这个取值规则称为堆的“属性”; 堆顶元素(即根节点)总是为最大值或最小值。 堆的种类 堆分为小根堆和大根堆两种。小根堆要求每个节点的值都不大于其父节点的值,即A[PARENT[i]] &…

    数据结构 2023年5月17日
    00
  • C语言数据结构之 折半查找实例详解

    C语言数据结构之 折半查找实例详解 什么是折半查找? 折半查找是一种在有序数组中查找某个特定元素的算法。其基本思想是将查找的值与数组的中间元素比较,如果比中间元素小,则在数组的左半部分查找;如果比中间元素大,则在数组的右半部分查找,直到找到该元素或查找范围为空。 折半查找算法的流程 确定要查找的数组arr和其元素个数n,以及要查找的元素value。 设定左边…

    数据结构 2023年5月17日
    00
  • Java数据结构二叉树难点解析

    Java数据结构二叉树难点解析 什么是二叉树 二叉树是一种非常常见的数据结构,它具有以下特点: 每个节点都最多有两个子节点。 左子节点的值小于等于父节点的值,右子节点的值大于等于父节点的值。 二叉树可以用递归的方式实现,如下所示: class TreeNode { int val; TreeNode left; TreeNode right; TreeNod…

    数据结构 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部