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

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
  • java数据结构排序算法之树形选择排序详解

    Java数据结构排序算法之树形选择排序详解 什么是树形选择排序 树形选择排序是对选择排序的一种改进和优化,它是通过利用完全二叉树的性质对选择排序进行了改进而得到的一种高效的排序算法。 树形选择排序通过将待排序的元素构建成一颗完全二叉树,然后从叶子节点向上比较,选择出最小的元素,并交换位置。这样子,每次选择最小元素的时候,减少了元素之间的比较次数,从而提高了排…

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

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

    数据结构 2023年5月17日
    00
  • C语言线性表全面梳理操作方法

    C语言线性表全面梳理操作方法 线性表概述 线性表是一种常用的数据结构,是指数据元素之间存在一定逻辑顺序,每个元素都有唯一的前驱和后继。 线性表有两种存储方式: 顺序存储结构 和 链式存储结构。 顺序存储结构 顺序存储结构是指采用顺序存储方式存储线性表,即将线性表的元素依次存储在一段连续的存储空间内。 代码示例:创建顺序存储线性表 #define MaxSiz…

    数据结构 2023年5月17日
    00
  • Java数据结构之二叉排序树的实现

    Java数据结构之二叉排序树的实现 二叉排序树(Binary Sort Tree)是一种特殊的二叉树结构,它的每个结点都包含一个关键字,并满足以下性质: 左子树中所有结点的关键字都小于根结点的关键字; 右子树中所有结点的关键字都大于根结点的关键字; 左右子树也分别为二叉排序树。 这种结构有助于实现快速的查找、插入和删除操作。在此,我们将展示一种实现二叉排序树…

    数据结构 2023年5月17日
    00
  • Android随手笔记44之JSON数据解析

    Android随手笔记44之JSON数据解析 1. JSON数据的基本概念 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于 JavaScript 的一个子集。JSON 格式最初是为了解决 JavaScript 程序通过 AJAX 传输数据时的数据交换格式问题而出现的,但是现在已经成为了一种通用的数据格式。…

    数据结构 2023年5月17日
    00
  • Java数据结构与算法学习之循环链表

    Java数据结构与算法学习之循环链表 本文将详细介绍Java数据结构中的一种链表类型——循环链表,并讲解如何使用Java实现循环链表。同时,本文也提供了两个示例,方便读者更好地理解和运用循环链表。 什么是循环链表 循环链表是一种链表,它与单向链表和双向链表不同之处在于它的最后一个结点指向第一个结点。这就形成了一个循环链,因此称之为循环链表。 如何实现循环链表…

    数据结构 2023年5月17日
    00
  • AtCoder Beginner Contest 300

    A – N-choice question (abc300 a) 题目大意 给定一个元素互不相同的数组\(c\)和 \(a,b\),找到 \(i\)使得 \(c_i = a + b\) 解题思路 直接for循环寻找即可。 神奇的代码 #include <bits/stdc++.h> using namespace std; using LL = …

    算法与数据结构 2023年4月30日
    00
合作推广
合作推广
分享本页
返回顶部