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日

相关文章

  • Python数据结构之双向链表详解

    Python数据结构之双向链表详解 什么是双向链表? 在计算机科学中,双向链表是链表的一种,每个结点除了储存下一个结点的指针外,还储存着前一个结点的指针。这个“前进”指针被称为“ next指针”,而“后退”指针被称为“previous指针”。 双向链表和单向链表的区别在于,单向链表的每个结点只储存一个指向下一个结点的指针,而双向链表储存了前一个和后一个结点的…

    数据结构 2023年5月17日
    00
  • java实现队列queue数据结构详解

    Java实现队列(Queue)数据结构详解 什么是队列(Queue) 队列(Queue),是一种先进先出(First In First Out, FIFO)的数据结构,即最先进入队列的元素也会最先出队列。 队列具备两个基本操作:入队(enqueue)和出队(dequeue)。入队操作将元素加入到队列的尾部,出队操作将元素从队列头部取出并删除。 Java中的Q…

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

    Java数据结构之线索化二叉树的实现 线索化二叉树的概述 线索化二叉树(Threaded Binary Tree)是一种优化的二叉树结构。它的优点是可以在O(n)的时间复杂度内,进行中序遍历。而在普通二叉树中进行中序遍历需要的时间复杂度是O(nlogn)。线索化二叉树的原理是利用空闲的指针域,来记录中序遍历中前驱与后继结点的位置。线索化二叉树中会出现两种类型…

    数据结构 2023年5月17日
    00
  • C语言实现数据结构迷宫实验

    C语言实现数据结构迷宫实验攻略 简介 迷宫是计算机图形学中的一个经典问题,也是数据结构和算法中常见的题目。C语言是一种广泛使用的编程语言,具有充分的编程接口和功能,可以方便地实现迷宫算法和数据结构。 本文将详细讲解C语言实现数据结构迷宫实验的完整攻略,让读者能够更加深入地理解迷宫算法和数据结构的应用。 实现步骤 1. 创建迷宫结构体 首先需要创建一个迷宫结构…

    数据结构 2023年5月17日
    00
  • 带你了解Java数据结构和算法之2-3-4树

    带你了解Java数据结构和算法之2-3-4树 1. 什么是2-3-4树 2-3-4树是一种自平衡二叉查找树,也叫B树的一种,它可以保持树的平衡,使得每个节点的左右子树高度差最多为1。在2-3-4树中,每个节点可以包含2个、3个或4个子节点,这也是其名称的来源。2-3-4树是B树的特殊形式,通常用于内存储存结构。 2. 2-3-4树的特点 2-3-4树的特点如…

    数据结构 2023年5月17日
    00
  • 自学1

    Problem1 明明的随机数 ## 题目描述 明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了 N 个 1 到 1000 之间的随机整数 (N <= 100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“…

    算法与数据结构 2023年4月24日
    00
  • Python数据结构与算法之链表定义与用法实例详解【单链表、循环链表】

    Python数据结构与算法之链表定义与用法实例详解 什么是链表? 链表是一种常见的数据结构,它由一个个的节点组成,每个节点包含两部分,一部分存储数据,一部分存储下一个节点在哪里的指针。通过节点之间的指针,就可以将节点串起来,形成一个链表。 链表和数组是两种截然不同的数据结构,数组的元素在内存中是连续存储的,而链表的节点却可以分散在内存的不同位置,这也是链表灵…

    数据结构 2023年5月17日
    00
  • C++LeetCode数据结构基础详解

    C++LeetCode数据结构基础详解攻略 什么是LeetCode? LeetCode是一个专门为程序员提供的算法题平台。平台上汇集了各种算法、数据结构和编程题,用户可以在平台上挑战各种难度的算法用来提高自己的编程能力和算法素养。 如何学习LeetCode? 学习LeetCode的关键是掌握数据结构和算法。下面介绍如何结合具体的C++代码来学习LeetCod…

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