简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!
优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀
优质专栏:多媒体系统工程师系列【原创干货持续更新中……】🚀
人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.
1.前言
本篇目的:C++之红黑树插入+查找实例
2.红黑树介绍
- 红黑树是一种自平衡二叉查找树,它能够保持树的平衡,从而确保查找、插入和删除操作的最坏情况时间复杂度为O(log n)。红黑树通过约束节点的颜色和规则来保持平衡,这些规则包括:
- 每个节点非红即黑。
- 根节点是黑色的。
- 所有叶子节点(NIL节点)是黑色的。
- 若一个节点是红色的,则它的子节点都是黑色的。
- 从任意节点到其每个叶子节点的所有路径都包含相同数量的黑色节点。
红黑树的作用主要体现在以下几个方面: - 维持树的平衡:红黑树通过自动调整节点颜色和旋转操作,确保树的高度大约为log(n),从而保证查找、插入和删除操作的高效性。
- 提高查找效率:由于红黑树保持平衡,因此查找操作的时间复杂度为O(log n),这使得红黑树在数据查找场景中具有很高的效率。
- 插入和删除操作:红黑树在插入和删除节点时,会通过旋转和变色操作来保持树的平衡,从而保证插入和删除操作的时间复杂度也为O(log n)。
- 应用广泛:红黑树作为一种高效的数据结构,被广泛应用于各种场景,如C++ STL中的map、set、multimap、multiset等容器,以及Linux内核中的调度器、内存管理等模块。
红黑树的用法如下: - 查找操作:红黑树的查找操作与二叉查找树相同,从根节点开始,如果查找的值小于当前节点,则递归查找左子树;如果查找的值大于当前节点,则递归查找右子树;如果查找的值等于当前节点,则返回当前节点。
- 插入操作:插入操作分为以下几个步骤:
a. 执行二叉查找树的插入操作,将新节点插入到合适的位置。
b. 将新插入的节点设置为红色。
c. 通过旋转和变色操作来修正红黑树,保持树的平衡。 - 删除操作:删除操作分为以下几个步骤:
a. 找到待删除节点的后继节点(中序遍历的后一个节点)。
b. 将后继节点的值复制到待删除节点,并将待删除节点设置为后继节点。
c. 删除后继节点,此时待删除节点的值已经被替换为后继节点的值。
d. 通过旋转和变色操作来修正红黑树,保持树的平衡。
- 总之,红黑树是一种高效的自平衡二叉查找树,通过约束节点颜色和规则来保持树的平衡,从而保证查找、插入和删除操作的高效性。红黑树广泛应用于各种场景,如C++ STL中的容器和Linux内核中的调度器、内存管理等模块。
3.代码实例
<1>.红黑树插入+查询功能
#include <iostream>// 枚举类型,表示节点的颜色
enum Color { RED, BLACK };// 节点结构体
template <typename T>
struct Node {T data; // 节点存储的数据Node<T> *left, *right, *parent; // 左子节点指针、右子节点指针、父节点指针Color color; // 节点的颜色// 构造函数Node(T data) : data(data), left(nullptr), right(nullptr), parent(nullptr), color(RED) {}
};// 红黑树类
template <typename T>
class RedBlackTree {
private:Node<T>* root; // 根节点指针
public:// 构造函数RedBlackTree() : root(nullptr) {}// 插入操作函数void insert(T data);// 搜索操作函数bool search(T data);
};// 插入操作实现
template <typename T>
void RedBlackTree<T>::insert(T data) {// 创建新节点Node<T>* newNode = new Node<T>(data);// 如果根节点为空,直接将新节点设为根节点,颜色为黑色if (root == nullptr) {root = newNode;root->color = BLACK;return;}// 否则,找到新节点的插入位置Node<T>* parent = nullptr;Node<T>* current = root;while (current != nullptr) {parent = current;if (newNode->data < current->data)current = current->left;elsecurrent = current->right;}// 将新节点插入到树中newNode->parent = parent;if (newNode->data < parent->data)parent->left = newNode;elseparent->right = newNode;
}// 搜索操作实现
template <typename T>
bool RedBlackTree<T>::search(T data) {Node<T>* current = root;while (current != nullptr) {if (data == current->data)return true;else if (data < current->data)current = current->left;elsecurrent = current->right;}return false;
}int main() {// 创建红黑树对象RedBlackTree<int> tree;// 向树中插入一些元素tree.insert(10);tree.insert(20);// 搜索并输出结果std::cout << "Searching for 10: " << (tree.search(10) ? "Found" : "Not found") << std::endl;std::cout << "Searching for 25: " << (tree.search(25) ? "Found" : "Not found") << std::endl;return 0;
}