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

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日

相关文章

  • Java数据结构之对象的比较

    Java数据结构之对象的比较 在Java中,对象的比较是非常重要的操作。我们常常需要对不同的对象进行比较,以便对它们进行排序、按照某个条件过滤等操作。本文将详细讲解Java中对象的比较,并给出一些示例来说明。 对象的比较方法 Java中有两种对象比较方法:值比较和引用比较。值比较就是比较两个对象的值是否相等,而引用比较是比较两个对象是否是同一个对象。 值比较…

    数据结构 2023年5月17日
    00
  • 【ACM算法竞赛日常训练】DAY5题解与分析【储物点的距离】【糖糖别胡说,我真的不是签到题目】| 前缀和 | 思维

    DAY5共2题: 储物点的距离(前缀和) 糖糖别胡说,我真的不是签到题目(multiset,思维) ? 作者:Eriktse? 简介:19岁,211计算机在读,现役ACM银牌选手?力争以通俗易懂的方式讲解算法!❤️欢迎关注我,一起交流C++/Python算法。(优质好文持续更新中……)?? 原文链接(阅读原文获得更好阅读体验):https://www.eri…

    算法与数据结构 2023年4月18日
    00
  • Java数据结构之哈夫曼树概述及实现

    Java数据结构之哈夫曼树概述及实现 哈夫曼树概述 哈夫曼树(Huffman Tree),也称为最优树(Optimal Binary Tree),是一种带权路径长度最短的二叉树,也就是最小权重的前缀编码树。其基本思想是采用频率作为节点的权值,将频率较小的节点放在左子树上,频率较大的节点放在右子树上,从而形成一棵权值最小的二叉树。 实现过程 实现哈夫曼树需要以…

    数据结构 2023年5月17日
    00
  • C语言二叉树的概念结构详解

    C语言二叉树的概念结构详解 什么是二叉树 二叉树是一种特殊的树形结构,它由一个根节点和若干个子树组成,其中每个节点都最多有两个子节点,分别称为它的左子节点和右子节点。 二叉树的结构 一个二叉树通常由以下几个结构组成: 数据域:存储节点所包含的数据 左节点:节点左侧的子节点,如果为空节点,则表示当前节点没有左子树 右节点:节点右侧的子节点,如果为空节点,则表示…

    数据结构 2023年5月17日
    00
  • JavaScript的Set数据结构详解

    JavaScript中的Set数据结构详解 什么是Set? Set 是一种 Javascript 内置的数据结构。它类似于数组,但是成员的值都是唯一的,没有重复的值。Set 本身是一个构造函数,可以通过new关键字来创建 Set 数据结构。 let mySet = new Set(); Set的基本用法 Set实例对象有以下常用方法: add(value):…

    数据结构 2023年5月17日
    00
  • 一文带你走进js数据类型与数据结构的世界

    一文带你走进JS数据类型与数据结构的世界 一、JS数据类型 1. 原始类型 JS中原始类型包括:Undefined、Null、Boolean、Number、String、Symbol(ES6新增)。 其中Undefined和Null分别代表未定义和空值,Boolean表示布尔值,Number表示数字,String表示字符串,Symbol是ES6新增的一种基础…

    数据结构 2023年5月17日
    00
  • C语言 结构体数组详解及示例代码

    C语言 结构体数组详解及示例代码 结构体是C语言中最为基础的数据结构之一,它可以将多个数据类型组合成一个整体,方便地进行访问和管理。而结构体数组则是将多个相同结构体类型的变量按照一定规律排列在一起的一种数据结构。本文将详细讲解C语言中结构体数组的使用方法及示例代码。 定义结构体 首先,我们需要定义一个结构体类型。结构体类型需要指定名称、成员变量及其数据类型:…

    数据结构 2023年5月17日
    00
  • Python中的函数式编程:不可变的数据结构

    Python是一门支持函数式编程的语言。相比于传统的命令式编程,函数式编程更加强调数据的不可变性。本文将介绍如何在Python中使用不可变的数据结构实现函数式编程。 什么是不可变的数据结构? 不可变数据结构是指一旦创建就无法改变的数据结构。在Python中,元组(tuple)是一个典型的不可变数据结构。以下是一个创建元组的示例代码: a_tuple = (1…

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