代码如下:

#include <iostream>
#include <ctime>
using namespace std;enum COLOR
{BLACK,RED
};template<typename T>
struct RBTreeNode
{RBTreeNode<T> * _parent;RBTreeNode<T> * _left;RBTreeNode<T> * _right;T _val;COLOR _color;RBTreeNode(const T & val = T()):_parent(nullptr),_left(nullptr),_right(nullptr),_val(val),_color(RED){}};template<typename T>
class RBTree
{public:typedef RBTreeNode<T> Node;RBTree():_root(nullptr){}bool insert(const T & val){if (_root == nullptr) {_root = new Node(val);_root->_color = BLACK;return true;}Node *cur = _root;Node *parent = nullptr;//1.寻找要插入的结点的位置while (cur){parent = cur;if (cur->_val == val) return false;else if (cur->_val > val) cur = cur->_left;else cur = cur->_right;}//2.创建结点cur = new Node(val);if (parent->_val > cur->_val) parent->_left = cur;else parent->_right = cur;cur->_parent = parent;//3.颜色的修改或者结构的调整while (cur != _root && cur->_parent->_color == RED)//不为根且存在连续红色,则需要调整{parent = cur->_parent;Node *gfather = parent->_parent;if (gfather->_left == parent){Node *uncle = gfather->_right;//情况1.uncle存在且为红if (uncle && uncle->_color == RED){parent->_color = uncle->_color = BLACK;gfather->_color = RED;//向上追溯cur = gfather;}else{if (parent->_right == cur){RotateL(parent);swap(cur, parent);}//情况2.uncle不存在或者uncle为黑RotateR(gfather);parent->_color = BLACK;gfather->_color = RED;break;}}else{Node *uncle = gfather->_left;if (uncle && uncle->_color == RED){parent->_color = uncle->_color = BLACK;gfather->_color = RED;//向上追溯cur = gfather;}else{if (parent->_left == cur){RotateR(parent);swap(cur, parent);}RotateL(gfather);parent->_color = BLACK;gfather->_color = RED;break;}}}//根结点都为黑色_root->_color = BLACK;return true;}void RotateL(Node *parent){Node *subR = parent->_right;Node *subRL = subR->_left;parent->_right = subRL;if (subRL) subRL->_parent = parent;if (parent == _root){_root = subR;subR->_parent = nullptr;}else{Node *gfather = parent->_parent;if (gfather->_left == parent) gfather->_left = subR;else gfather->_right = subR;subR->_parent = gfather;}subR->_left = parent;parent->_parent = subR;}void RotateR(Node * parent){Node *subL = parent->_left;Node *subLR = subL->_right;parent->_left = subLR;if (subLR) subLR->_parent = parent;if (parent == _root){_root = subL;subL->_parent = nullptr;}else{Node *gfather = parent->_parent;if (gfather->_left == parent) gfather->_left = subL;else gfather->_right = subL;subL->_parent = gfather;}subL->_right = parent;parent->_parent = subL;}void inorder(){_inorder(_root);cout << endl;}
//红黑树的性质:
//  1.每个结点的颜色只有红色和黑色,且根结点必须为黑色
//  2.不能存在连续的红色结点
//  3.对于每个结点来说,从该结点到其所有后代结点的简单路径上,经过的黑色结点的数目应该是相同的bool isRBTree(){if (_root == nullptr) return true;//空树也属于红黑树if (_root->_color == RED) return false;//不满足性质2:根结点必须为黑色int bCount = 0;//从某条路径上的黑色结点数Node *cur = _root;while (cur){if (cur->_color == BLACK) ++bCount;cur = cur->_left;}int pathCount = 0;return _isRBTree(_root, bCount, pathCount);}bool _isRBTree(Node *root, const int bCount, int pathCount){if (root == nullptr)//路径走完,判断黑色结点个数{if (pathCount == bCount) return true;else return false;//不满足性质3:每一条路径上的黑色结点个数相同}if (root->_color == BLACK) ++pathCount;Node *parent = root->_parent;if (parent && parent->_color == RED && root->_color == RED) return false;//不满足性质2:不能存在连续的红色结点return _isRBTree(root->_left, bCount, pathCount) && _isRBTree(root->_right, bCount, pathCount);}private:Node *_root;void _inorder(Node *root){if (root){_inorder(root->_left);cout << root->_val << " ";_inorder(root->_right);}}
};int main()
{RBTree<int> rbt;srand(time(nullptr));int n;cout << "num = " << endl;cin >> n;for (int i = 0; i < n; i++){rbt.insert(rand());}rbt.inorder();if (rbt.isRBTree()) cout << "yes" << endl;else cout << "no" << endl;return 0;
}

测试结果:

C++ 泛型编程 实现红黑树RBTree相关推荐

  1. 红黑树(RB-Tree)比AVL强在哪?

    前言 以前本科同学在找工作的时候,就被面试官问到过关于红黑树的问题.因为当时我的知识面不广,所以也不知道红黑树是个什么东西,也没放在心上.在看过了STL源码后才知道原来有很多底层实现都用的红黑树.简单 ...

  2. 红黑树RBTree原理(超易懂)

    红黑树脑图 目录 文章目录 红黑树的定义 四点特征 为什么红黑树是近似平衡的 (1)首先,我们来看,如果我们将红色节点从红黑树中去掉,那单纯包含黑色节点的红黑树的高度是多少呢? (2)现在把红色节点加 ...

  3. 《恋上数据结构第1季》红黑树(未完)

    红黑树(Red Black Tree) 红黑树介绍 红黑树 与 4阶B树 红黑树 与 2-3-4树 等价转换 红黑树基础代码 完整的红黑树系列代码(恐怖如斯) 二叉树 BinaryTree.java ...

  4. 关于hash,hashCode, hashMap,红黑树

    小刘老师讲HashMap源码 小刘老师讲红黑树 hash,hashCode,hashMap 1.前提知识 数组: 列表: 散列表 什么是hash? hash也称散列,哈希,基本原理就是把任意长度的输入 ...

  5. HashMap底层红黑树实现(自己实现一个简单的红黑树)

    文章整理于小刘老师讲源码 视频学习链接:小刘老师讲解红黑树 JDK集合源码之HashMap解析(上) JDK集合源码之HashMap解析(下) 1.树结构入门 1.1 什么是树? 树(tree)是一种 ...

  6. 红黑树效率为甚恶魔是log_Linux内核-深入理解红黑树与B+树应用场景

    一.红黑树和B树应用场景有何不同? 2者都是有序数据结构,可用作数据容器.红黑树多用在内部排序,即全放在内存中的,微软STL的map和set的内部实现就是红黑树.B树多用在内存里放不下,大部分数据存储 ...

  7. 红黑树分析与JDK8中HashMap源码解析

    红黑树分析与JDK8中HashMap源码解析 BST O(1), O(n), O(logn), O(nlogn) 的区别 红黑树-RBTree 插入数据 HashMap中红黑树的插入操作 HashMa ...

  8. C++_泛型编程与标准库(九)——红黑树的使用

    C++_泛型编程与标准库(九)--红黑树的使用 参考:<侯捷泛化编程与标准库>.GNU9.3.0,vs2019 图中标红部分为自己的笔记理解 struct _Rb_tree_node_ba ...

  9. C++ RBTree(红黑树) 算法(附完整源码)

    C++ RBTree红黑树的算法 RBTree(红黑树) 的完整源码(定义,实现,main函数测试) RBTree(红黑树) 的完整源码(定义,实现,main函数测试) #include<ios ...

最新文章

  1. 计算机vb2级知识点,二级考试(VB)知识点细化(针对浙江省计算机等级考试)
  2. 2020 CCPC-Wannafly Winter Camp Day1 总结
  3. 642-832 GNS3 自搭建拓扑
  4. 开发日记-20190613 关键词 读书笔记《鸟哥的Linux私房菜-基础学习篇》
  5. 如何复制一个含有随机指针节点的链表
  6. 服务中添加mysql服务_Windows平台下在服务中添加MySQL
  7. python函数不定参数_python如何定义不定参数函数
  8. java dto entity,entity与DTO完全一致时
  9. 登录mysql一闪而过_解决MySQL 一闪而过的情况
  10. 【转】卡巴斯基安全公告称甲骨文数据库存在加密漏洞
  11. FinClip黑客马拉松@您,小程序风云来袭
  12. 什么是高防ip?高防ip是什么意思?
  13. SVG 图标制作指南
  14. K8S污点容忍度调度
  15. rhel6 中安装使用finger命令
  16. 详解c语言main函数、printf函数、scanf函数与va家族
  17. 《一万年以后》一段充满癫狂想象力的奇幻之旅
  18. 【转知乎】异地恋如何维持之电子本科生
  19. Vue.js函数的生命周期
  20. 安装skimage报错解决方案

热门文章

  1. Android之kotlin里面本地图片BitmapFactory.decodeFile转bitmap失败问题
  2. linux c之用fopen、fputs、fgets、 fseek来对文件进行写、替换、读
  3. 【二】Windows API 零门槛编程指南——CreateWindow 窗口创建 “万字长篇专业术语全解”
  4. 【C语言简单说】二十一:双重指针基础 (完结)
  5. java把对象转成json_java 把对象 对象转换成json字符串 | 学步园
  6. antd option宽度自适应_建议收藏:Axure手机自适应教程
  7. 抛物面天线的工作原理是什么?
  8. 正方形与圆的爱恨纠缠...
  9. 当时我就震惊了:无穷带来的各种悖论
  10. 建立学生选课表 mysql 语句_MySQL常用SQL语句(Python实现学生、课程、选课表增删改查)...