红黑树简介与C++应用

2023-05-16

简介

红黑树(Red Black Tree) 是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组。
它是在1972年由Rudolf Bayer发明的,当时被称为平衡二叉B树(symmetric binary B-trees)。后来,在1978年被 Leo J. Guibas 和 Robert Sedgewick 修改为如今的“红黑树”。
红黑树和AVL树类似,都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能。
它虽然是复杂的,但它的最坏情况运行时间也是非常良好的,并且在实践中是高效的: 它可以在O(log n)时间内做查找,插入和删除,这里的n 是树中元素的数目。

红黑树的性质

  • 性质1. 节点是红色或黑色。

  • 性质2. 根节点是黑色。

  • 性质3 每个叶节点(NIL节点,空节点)是黑色的。

  • 性质4 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)

  • 性质5. 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。

PAT1135 Is It A Red-Black Tree

There is a kind of balanced binary search tree named red-black tree in the data structure. It has the following 5 properties:
(1) Every node is either red or black.
(2) The root is black.
(3) Every leaf (NULL) is black.
(4) If a node is red, then both its children are black.
(5) For each node, all simple paths from the node to descendant leaves contain the same number of black nodes.
For example, the tree in Figure 1 is a red-black tree, while the ones in Figure 2 and 3 are not.

在这里插入图片描述
For each given binary search tree, you are supposed to tell if it is a legal red-black tree.
Input Specification:

Each input file contains several test cases. The first line gives a positive integer K (≤30) which is the total number of cases. For each case, the first line gives a positive integer N (≤30), the total number of nodes in the binary tree. The second line gives the preorder traversal sequence of the tree. While all the keys in a tree are positive integers, we use negative signs to represent red nodes. All the numbers in a line are separated by a space. The sample input cases correspond to the trees shown in Figure 1, 2 and 3.

Output Specification:

For each test case, print in a line “Yes” if the given tree is a red-black tree, or “No” if not.

Sample Input:

7 -2 1 5 -4 -11 8 14 -15
9
11 -2 1 -7 5 -4 8 14 -15
8
10 -7 5 -6 8 15 -11 17

Sample Output:

Yes
No
No

#include<iostream>
#include<vector>
#include<cmath>
using namespace std;
vector<int> arr;
struct node{
    int val;
    struct node *left, *right;//以链表的方式存储
};
 
node* build(node *root, int v){
    //递归二叉查找树
    if(root == NULL){
        root = new node();
        root->val = v;
        root->left = root->right = NULL;
    }else if(abs(v) <= abs(root->val))//小于根节点的为左边递归
        root->left = build(root->left, v);
    else
        root->right = build(root->right, v);
    return root;
}
 
bool judgeBlackChild(node *root){
    //判断红色节点的孩子为黑色
    if(root == NULL)return true;
    if(root->val < 0){//red negative
        if(root->left != NULL && root->left->val < 0 )return false;
        if(root->right != NULL && root->right->val < 0)return false;
    }
    return judgeBlackChild(root->left) && judgeBlackChild(root->right);
}
 
int getNum(node *root){
    if(root == NULL)return 0;
    int l = getNum(root->left);
    int r = getNum(root->right);
    return root->val > 0 ? max(l, r) + 1 : max(l, r);
    //大于0是黑色节点,如果是黑色节点则加1,否则不变
}
 
int judgeBlackNum(node *root){
    //判断数量是否相同
    if(root == NULL)return true;
    int l = getNum(root->left);
    int r = getNum(root->right);
    if(l != r)return false;
    return judgeBlackNum(root->left) && judgeBlackNum(root->right);
}
 
int main(){
    int k, n;
    cin>>k;
    for(int i = 0; i < k; i++){
        cin>>n;
        arr.resize(n);
        node *root = NULL;
        for(int j = 0; j < n; j++){
            cin>>arr[j];
            root = build(root, arr[j]);
        }
        if(arr[0] < 0 || !judgeBlackChild(root)|| !judgeBlackNum(root))
            cout<<"No\n";
        else
            cout<<"Yes\n";
    }
    return 0;
}

更多内容访问
omegaxyz.com
网站所有代码采用Apache 2.0授权
网站文章采用知识共享许可协议BY-NC-SA4.0授权
© 2019 • OmegaXYZ-版权所有 转载请注明出处

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

红黑树简介与C++应用 的相关文章

  • IntelliJ IDEA创建Java-Web项目

    eclipse和idea都能够创建Java web项目 下面介绍使用idea创建Java web项目的步骤 需要准备的东西 intellij idea xff08 包括jdk xff09 Tomcat7 0 43 可选 xff08 如果需要
  • 基于拥挤距离与变异支配的多目标PSO算法

    这一篇是Xue Bing在一区cybernetics发的论文 xff0c 里面提出了两个多目标PSO特征选择算法 xff0c 一个是NSPSO另一个是CMDPSO 其中NSPSO是参考了NSGA2的框架和思想 下面具体说说CMDPSO CM
  • Cohen-Sutherland算法概述

    思想 通过对于任一端点 x y xff0c 根据其坐标所在的区域 xff0c 赋予一个4位的二进制码 xff0c 判断图形元素是否落在裁剪窗口之内并通过求交运算找出其位于内部的部分 编码方式 注意 xff1a l为left xff0c r为
  • 人机交互的形式

    命令行交互 优点 xff1a 专家用户使用命令行能够更加快速地完成任务 较图形界面更加节约系统资源 对用户而言是开放的 xff0c 不存在图形界面中不能动态配置用户可操作选项的问题 键盘操作方式较鼠标操作更加精确 xff0c 对应用的掌控力
  • canvas 报错记录 (一)

    在执行下面代码的时候报错 var can 61 document getElementById 34 can 34 var ctx 61 can getContext ctx content cfillRect 500 500 200 20
  • 进化计算中基于分类的预处理代理模型

    问题提出 代理模型的构造较复杂 xff0c 作者希望构造一个更为简单的廉价 xff08 cheap xff09 的代理模型来评估子集的质量 因此作者提出了一个叫做CPS xff08 classification based preselec
  • Python利用Graphviz画图

    Graphviz的是AT amp T Labs Research开发的图形绘制工具软件 Graphviz的是AT amp T Labs Research开发的图形绘制工具 他可以很方便的用来绘制结构化的图形网络 支持多种格式输出 生成图片的
  • Java-Web项目总结

    使用jetbrain的idea创建Java Web项目 链接地址 xff1a http www omegaxyz com 2018 10 04 intellij idea java web Java MVC模式概述 链接地址 xff1a h
  • 基于WMD(词移距离)的句子相似度分析简介

    word2vec word2vec是只有一个隐层的全连接神经网络 对语料中的所有词汇进行训练并生成相应的词向量 xff08 Word Embedding xff09 WI 的大小是VxN V是单词字典的大小 每次输入是一个单词 N是设定的隐
  • Android 使用字符串动态获取资源ID

    android文件中每个文件都有一个ID xff0c 如下图所示 xff0c 左边的0x7f060000即是文件的ID xff1a 如果我们想在代码中获取这个文件的ID应该使用高效率的反射机制 xff0c 可以新建一个Java类代码如下 x
  • wxpython画表格代码

    wxPython是Python语言的一套优秀的GUI图形库 允许Python程序员很方便的创建完整的 功能键全的GUI用户界面 wxPython是作为优秀的跨平台GUI库wxWidgets的Python封装和Python模块的方式提供给用户
  • 数据库c3p0配置SQL Server与MySQL

    C3P0是一个开源的JDBC连接池 xff0c 它实现了数据源和JNDI绑定 xff0c 支持JDBC3规范和JDBC2的标准扩展 目前使用它的开源项目有Hibernate xff0c Spring等 SQL Server配置 xff1a
  • JSP连数据库登录检查用户名和密码模板

    JSP全名为Java Server Pages xff0c 中文名叫java服务器页面 xff0c 其根本是一个简化的Servlet设计 xff0c 它是由Sun Microsystems公司倡导 许多公司参与一起建立的一种动态网页技术标准
  • 基于移动设备与CNN的眼动追踪技术简介

    眼动追踪是一项科学应用技术 xff0c 用户无需与交互设备物理接触即可发送信息与接收反馈 从原理上看 xff0c 眼动追踪主要是研究眼球运动信息的获取 建模和模拟 xff0c 用途颇广 而获取眼球运动信息的设备除了红外设备之外 xff0c
  • 递归下降实现LL(1)文法分析C语言与Python实现

    对文法G的句子进行确定的自顶向下语法分析的充分必要条件是 xff0c G的任意两个具有相同左部的产生式A gt 满足下列条件 xff1a xff08 1 xff09 如果 均不能推导出 xff0c 则 FIRST FIRST 61 xff0
  • Ubuntu下gcc的安装

    sudo apt get build dep gcc
  • PyTorch入门

    PyTorch入门 PyTorch 是一个建立在 Torch 库之上的 Python 包 xff0c 旨在加速深度学习应用 PyTorch 提供一种类似 NumPy 的抽象方法来表征张量 xff08 或多维数组 xff09 xff0c 它可
  • 华氏451

    2015年12月21日 xff0c 因特网工程指导组 IETF 批准了全新HTTP状态错误代码 451 xff0c 这个代码的官方释义为 由于法律原因而不可用 451 数字来源于 1953 年由美国作家雷 布莱伯利所著的反乌托邦小说 华氏
  • 蚁群算法最短路径规划多出口情况及问题答疑

    最近好多人问我蚁群算法最短路径规划如何设置多出口情况 xff0c 原来2019年美赛D题 拯救卢浮宫 需要用到 本人没有看过美赛的题目 xff0c 下面给出一些不成熟的代码 蚁群算法简介 xff1a 蚁群算法最早是由Marco Dorigo
  • 反世代距离评价指标IGD

    反世代距离评价指标 Inverted Generational Distance IGD 是一个综合性能评价指标 它主要通过计算每个在真实 Pareto前沿面上的点 个体 到算法获取的个体集合之间的最小距离和 xff0c 来评价算法的收敛性

随机推荐

  • 遗传算法解决TSP问题MATLAB实现(详细)

    问题定义 xff1a 巡回旅行商问题 给定一组n个城市和俩俩之间的直达距离 xff0c 寻找一条闭合的旅程 xff0c 使得每个城市刚好经过一次且总的旅行距离最短 TSP问题也称为货郎担问题 xff0c 是一个古老的问题 最早可以追溯到17
  • 二叉树遍历的转换C++实现

    二叉树的遍历分为以下三种 xff1a 先序遍历 xff1a 遍历顺序规则为 根左右 中序遍历 xff1a 遍历顺序规则为 左根右 后序遍历 xff1a 遍历顺序规则为 左右根 什么是 根左右 就是先遍历根 xff0c 再遍历左节点 xff0
  • Java数据存取对象(DAO)

    什么是DAO DAO xff08 Data Access Object xff09 顾名思义是一个为数据库或其他持久化机制提供了抽象接口的对象 xff0c 在不暴露底层持久化方案实现细节的前提下提供了各种数据访问操作 在实际的开发中 xff
  • 经典蝙蝠算法MATLAB实现

    为什么会有这么多基于群智能的算法 xff0c 蚁群 粒子群 鱼群 烟花 炮竹 猪群 牛群 马群 羊群 猴群 鸡群 算法 xff1f xff1f xff1f xff1f xff1f xff1f 黑人问号 jpg 蝙蝠算法 BA 是 Yang
  • 计算机领域顶级会议、期刊、人物与国家排名2019

    原文地址 xff1a 最近浏览到一个网站 xff1a http www guide2research com 这是一个根据谷歌学术排名的计算机领域各类会议 学术期刊 人物 国家 组织的排名查询网站 时间2019年3月 会议 按照Hindex
  • 基于迭代局部搜索和随机惯性权重的BA算法MATLAB实现(ILSSIWBA)

    BA算法简介 http www omegaxyz com 2019 02 12 ba matlab 该论文修改 作者在原有BA算法上进行3个修改 跳出局部最优 xff08 扰动个体 xff09 使得算法变得稳定脉搏和响度修改 xff0c 平
  • Ubuntu下pip的安装与升级

    安装 pip2 sudo apt get install python pip python dev build essential wukai 64 wukai sudo apt install python span class hlj
  • PyQt5多线程刷新界面防假死

    在做GUI界面时我们希望后台任务能够与UI分开 xff0c 在PyQt中 xff0c 主线程用来重绘界面 而子线程里边的实时处理结果需要反馈到界面 xff0c 子线程里边不能执行界面更新操作 wxpython多线程刷新界面转到 http w
  • NSGA2算法中文详解与MATLAB实现整理

    NSGA2算法 NSGA II多目标遗传算法概述 http www omegaxyz com 2017 04 14 nsga iiintro NSGA2算法MATLAB实现 xff08 能够自定义优化函数 xff09 http www om
  • 对极大似然估计的理解

    参数估计 xff08 parameter estimation xff09 统计推断的一种 根据从总体中抽取的随机样本来估计总体分布中未知参数的过程 从估计形式看 xff0c 区分为点估计与区间估计 xff1a 从构造估计量的方法讲 xff
  • 动态规划——最大整除子集C++

    来自LeetCode 368 描述 给出一个由无重复的正整数组成的集合 xff0c 找出其中最大的整除子集 xff0c 子集中任意一对 Si xff0c Sj 都要满足 xff1a Si Sj 61 0 或 Sj Si 61 0 如果有多个
  • HyperVolume多目标评价指标概述

    提出 Hypervolume 指标评价方法最早是由 Zitzler 等提出 xff0c 它表示由解集中的个体与参考点在目标空间中所围成的超立方体的体积 评价标准 Hypervolume 指 标 评 价 方 法 是 一 种 与 Pareto
  • 三路快排C++实现与应用

    本文共467个字 xff0c 预计阅读时间需要2分钟 三路快排是快速排序算法的升级版 xff0c 用来处理有大量重复数据的数组 主要思想是选取一个key xff0c 小于key的丢到左边 xff0c 大于key的丢到右边 xff0c 递归实
  • Wilcoxon秩和检验简介与MATLAB实现

    Wilcoxon秩和检验 rank sum test xff0c 有时也叫Mann Whitney U检验 xff0c 是另一类非参数检验方法 xff0c 它们不对数据分布作特殊假设 xff0c 因而能适用于更复杂的数据分布情况 适用性 x
  • FatMouse’ Trade

    简介 贪心算法 xff08 又称贪婪算法 xff09 是指 xff0c 在对问题求解时 xff0c 总是做出在当前看来是最好的选择 也就是说 xff0c 不从整体最优上加以考虑 xff0c 他所做出的是在某种意义上的局部最优解 贪心算法不是
  • 算法复杂度与NP问题

    引言 美剧 基本演绎法 S2E2中 xff0c 两位研究 NP 问题的数学家被谋杀了 xff0c 凶手是同行 xff0c 因为被害者即将证明 P 61 NP 问题 假设人类证明了P 61 NP 是真的 xff0c 那么就会有一个算法 xff
  • 素数筛C++

    埃拉托斯特尼筛法 xff08 sieve of Eratosthenes xff09 是古希腊数学家埃拉托斯特尼发明的计算素数的方法 对于求解不大于n的所有素数 xff0c 我们先找出sqrt n 内的所有素数p1到pk xff0c 其中k
  • ubuntu安装mysql-server环境解决无穷依赖问题

    问题 ubuntu14 04 3安装mysql时报错 xff1a sudo apt get install mysql server mysql client 正在读取软件包列表 完成 正在分析软件包的依赖关系树 正在读取状态信息 完成 有
  • Levenshtein编辑距离C++实现

    简介 Levenshtein Distance是1965年由苏联数学家Vladimir Levenshtein发明的 Levenshtein Distance也被称为编辑距离 xff08 Edit Distance xff09 在信息论和计
  • 红黑树简介与C++应用

    简介 红黑树 xff08 Red Black Tree xff09 是一种自平衡二叉查找树 xff0c 是在计算机科学中用到的一种数据结构 xff0c 典型的用途是实现关联数组 它是在1972年由Rudolf Bayer发明的 xff0c