C++高级数据结构之二叉查找树

yizhihongxing

C++高级数据结构之二叉查找树

什么是二叉查找树

二叉查找树,也称二叉搜索树(BST,Binary Search Tree),是一种常见的基于二叉树的数据结构,主要用于快速查找与排序。在二叉查找树上,左子树的每个节点都比其根节点小,右子树的每个节点都比其根节点大,同时整棵树也满足二叉树的性质。

二叉查找树的实现

我们可以通过C++语言实现二叉查找树的基本操作,包括元素的插入、删除、查找等。

二叉查找树的结构体定义

struct TreeNode {
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};

二叉查找树的插入操作

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

二叉查找树的删除操作

二叉查找树的删除操作需要分几种情况考虑,可以分为以下两种情况:

  • 被删除结点没有左子树或右子树,这种情况直接删除结点即可。
  • 被删除结点有左子树与右子树,这种情况需要寻找该结点的后继(即右子树中最小的元素),将后继的值取代该结点的值,再删除后继节点。

以下为二叉查找树的删除操作的实现:

void deleteNode(TreeNode* root, int val) {
    if (root == NULL) {
        return;
    }
    if (root->val > val) {
        deleteNode(root->left, val);
    } else if (root->val < val) {
        deleteNode(root->right, val);
    } else {
        if (root->left == NULL) {
            root = root->right;
        } else if (root->right == NULL) {
            root = root->left;
        } else {
            TreeNode* tmp = root->right;
            while (tmp->left != NULL) {
                tmp = tmp->left;
            }
            root->val = tmp->val;
            deleteNode(root->right, root->val);
        }
    }
}

二叉查找树的查找操作

TreeNode* search(TreeNode* root, int val) {
    if (root == NULL) {
        return NULL;
    }
    if (root->val == val) {
        return root;
    } else if (root->val > val) {
        return search(root->left, val);
    } else {
        return search(root->right, val);
    }
}

示例说明

我们可以使用以下二叉查找树:

       5
      / \
     3   7
    / \   \
   1   4   8

对其进行一系列操作,例如:

TreeNode* root = new TreeNode(5);
insert(root, 3);
insert(root, 7);
insert(root, 1);
insert(root, 8);
insert(root, 4);

/*
  结果为:
       5
      / \
     3   7
    / \   \
   1   4   8
*/

TreeNode* node = search(root, 4);
// 结果为:root->left->right

deleteNode(root, 5);

/*
  结果为:
       7
      / \
     3   8
    /   
   1   
    \  
     4
*/

总结

二叉查找树是一种高效的数据结构,其实现具有一定的难度,但如果掌握了基本操作,可以非常方便地进行二叉查找树的插入、删除、查找等操作。同时,二叉查找树的优化和扩展也是值得学习的一点,例如平衡二叉树AVL树、红黑树等。

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

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

相关文章

  • C语言数据结构之图书借阅系统

    C语言数据结构之图书借阅系统是一款基于C语言的软件,主要用于管理图书馆的借阅信息,并提供图书查询、借阅、归还等功能。本文将介绍图书借阅系统的完整攻略。 设计思路 图书借阅系统的设计主要包括三个阶段:系统设计、数据结构设计和用户接口设计。 系统设计 系统设计是构建整个系统的重要阶段,需要确定系统的功能需求、模块划分和流程控制。本系统的主要功能包括: 图书查询:…

    数据结构 2023年5月17日
    00
  • C语言超详细讲解数据结构中的线性表

    C语言超详细讲解数据结构中的线性表完整攻略 线性表的概念和基本操作 线性表是指由同类型的数据元素构成的有限序列。即每个数据元素只有一个前驱和一个后继。线性表通常用于表示一维数组、列表、队列等数据结构。 线性表的基本操作包括: 初始化操作:创建一个空的线性表。 插入操作:在线性表中插入一个元素。 删除操作:删除线性表中的一个元素。 查找操作:查找线性表中是否存…

    数据结构 2023年5月17日
    00
  • Java 详细分析四个经典链表面试题

    Java 详细分析四个经典链表面试题 简介 链表是数据结构中非常常见的一种形式,在Java中也有非常多的实现方式。本文将介绍Java中四个经典的链表面试题,并且详细分析它们的实现方法。在介绍每一个题目的详细实现之前,我们将简单介绍Java链表和链表常见操作。 Java链表 链表是一种线性结构,其中每个节点包含了一个数据域和一个指针域,指向下一个节点。Java…

    数据结构 2023年5月17日
    00
  • 数据结构 数组顺序存储详细介绍

    数据结构数组顺序存储详细介绍 什么是数组顺序存储? 数组是最基本的数据结构之一,在计算机程序中使用广泛。在数组中,存储的元素类型相同且占用相同的内存空间,可以通过下标进行快速访问和修改。数组可以使用不同的方法来存储在内存中,其中最简单的方法是数组顺序存储。 数组顺序存储是指将元素按照顺序依次存储在内存中的一块连续地址中,可以方便地进行随机访问。这种方式与链式…

    数据结构 2023年5月17日
    00
  • C语言数据结构之顺序数组的实现

    C语言数据结构之顺序数组的实现 前言 顺序数组是数据结构的一个重要部分,它代表着一种基本的数据结构,能够在数据存储与访问方面发挥极大的作用。本文将详细讲解如何在C语言中实现顺序数组。 简介 顺序数组是在物理内存中顺序存储的一组元素数据,可以通过下标访问任意一个元素。通常情况下,顺序数组的数据类型是相同的,而且每一个元素的大小也是相同的。 实现 实现顺序数组主…

    数据结构 2023年5月17日
    00
  • javascript数据结构与算法之检索算法

    JavaScript 数据结构与算法之检索算法 什么是检索算法 检索算法,也称为查找算法,是解决在数据集合中寻找某个特定元素的算法。 比如,在一个给定的数组中查找特定的元素,或者在一个字典中查找某个特定单词的定义等等,这些都是检索算法的应用场景。 JavaScript 中的检索算法主要有以下几种:线性查找、二分查找、哈希查找。 线性查找 线性查找,也叫顺序查…

    数据结构 2023年5月17日
    00
  • C语言编程数据结构的栈和队列

    C语言编程数据结构的栈和队列 什么是栈 栈(Stack) 是限定仅在表尾进行插入和删除操作的线性表。栈也称为后进先出( Last In First Out)的线性表,简称 LIFO 结构。栈结构有两个最重要的操作:入栈和出栈。其中,入栈操作向栈中添加一个元素,出栈操作从栈中删除一个元素。 栈的基本操作 初始化栈 入栈 出栈 取栈顶元素 判空 判满 // 栈的…

    数据结构 2023年5月17日
    00
  • 2021年最新Redis面试题汇总(1)

    下面我将为您详细讲解“2021年最新Redis面试题汇总(1)”的完整攻略。 1. Redis概述 首先,我们需要了解Redis是什么,以及它的特点和应用场景。 1.1 什么是Redis Redis是一种内存中的数据结构存储,可以用作数据库、缓存和消息中间件。它支持多种数据结构,如字符串、哈希、列表、集合和有序集合,并提供了丰富的功能,如事务、持久化、Lua…

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