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日

相关文章

  • LinkedList学习示例模拟堆栈与队列数据结构

    下面是关于“LinkedList学习示例模拟堆栈与队列数据结构”的完整攻略。 什么是LinkedList? LinkedList是Java语言中的一个类,用于表示链表数据结构。链表数据结构可以根据需要进行增、删、改、查等操作,是常用的数据结构之一。 如何使用LinkedList实现堆栈? 堆栈是一种先进后出(LIFO)的数据结构,可以使用LinkedList…

    数据结构 2023年5月17日
    00
  • Javascript数据结构与算法之列表详解

    Javascript数据结构与算法之列表详解 简介 本文旨在讲解Javascript中数据结构和算法的列表。 列表定义和实现 列表是一组有序的数据,每个列表中的数据项称为元素。在Javascript中,列表可以用数组来实现。数组的好处是它能够存储任意类型的数据,而且可以根据需要动态地调整数组的大小。下面是一个创建列表的基本模板: function List(…

    数据结构 2023年5月17日
    00
  • JS中的算法与数据结构之二叉查找树(Binary Sort Tree)实例详解

    JS中的算法与数据结构:二叉查找树(Binary Sort Tree) 什么是二叉查找树 二叉查找树(Binary Sort Tree),又称二叉搜索树或二叉排序树,是一种特殊的二叉树结构。它具有以下性质: 每个结点最多只有两个子结点。 左子树中的所有结点的值均小于它的根结点的值。 右子树中的所有结点的值均大于它的根结点的值。 没有相同节点值出现 因为具备以…

    数据结构 2023年5月17日
    00
  • 实际问题中用到的算法——递归算法确定插帧顺序

    问题: 现在需要给一个视频序列插帧,插帧算法要求每次只能由两帧输入插值得到其中间帧。如果现在需要给一个视频做 4 倍(或者更高的 8,16 倍等类似)的插帧,则一个插帧的思路是当前视频每相邻帧之间插入 3 帧,即:假设插帧前视频帧序号是 0,4,8,12…,则插帧时补充相邻帧跨过的 3 个序号,得到插帧后的视频帧序号为 0,1,2,3,4,5,6,.. 即可…

    算法与数据结构 2023年4月18日
    00
  • NTP时间同步服务器(频率同步)包含帧同步、载波同步、位同步

    NTP时间同步服务器(频率同步)包含帧同步、载波同步、位同步 NTP时间同步服务器(频率同步)包含帧同步、载波同步、位同步 京准电子科技官微——ahjzsz 同步的概念   同步技术是数字通信系统中非常重要的技术。一般来说数字通信系统要实现多种同步功能才能实现正确的数据通信任务。其技术目标是实现不同地域收发双方的同步通信互联,实现一致的信息数据交换,因此,通…

    算法与数据结构 2023年4月17日
    00
  • 数据结构用两个栈实现一个队列的实例

    下面我将详细讲解“数据结构用两个栈实现一个队列的实例”的完整攻略。 一、背景 在队列和栈这两种数据结构中,都可以实现数据的存储和操作。栈是一种后进先出(LIFO)的数据结构,而队列则是一种先进先出(FIFO)的数据结构。在实际应用中,很多场景需要同时具备队列和栈的特性,且要求效率较高,这时候就需要用两个栈实现一个队列的问题来解决了。 二、解决方案 考虑采用两…

    数据结构 2023年5月17日
    00
  • C语言数据结构之平衡二叉树(AVL树)实现方法示例

    C语言数据结构之平衡二叉树(AVL树)实现方法示例 介绍 AVL树是一种自平衡二叉搜索树,它保证了所有节点的左右子树高度差不超过1,从而提高了查找、插入和删除操作的效率。本篇文章将介绍如何使用C语言实现AVL树,并提供两个例子以说明实现方法。 实现方法 结构体定义 首先,定义AVL树节点的结构体,包括该节点存储的值、该节点的高度、该节点的左右子树指针。 ty…

    数据结构 2023年5月17日
    00
  • 剑指 Offer 33. 二叉搜索树的后序遍历序列(java解题)

    目录 1. 题目 2. 解题思路 3. 数据类型功能函数总结 4. java代码 5. 踩坑小记 递归调用,显示StackOverflowError 1. 题目 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。 参考以下这颗二叉搜索树: 5 / \ 2 6 /…

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