1135 Is It A Red-Black Tree(超详细注释+46行代码)

news2025/1/21 1:02:43

1135 Is It A Red-Black Tree

分数 30

全屏浏览题目

切换布局

作者 CHEN, Yue

单位 浙江大学

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.

Figure 1Figure 2Figure 3

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:

3
9
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

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

#include<bits/stdc++.h>
using namespace std;
const int N=40;
int n;
int pre[N],in[N];
map<int,int>pos;
bool ans;//作为判断是否为红黑树的标志 
int build(int il,int ir,int pl,int pr,int &sum){
    int root=pre[pl];//根结点 
    int k=pos[abs(root)];//根结点在中序序列的位置 
    if(il>k||ir<k){//若是不合法的序列直接返回 
        ans=false;
        return 0;
    }
    int left=0,right=0,ls=0,rs=0;//左右孩子和左右子树的黑节点个数 
    if(il<k)left=build(il,k-1,pl+1,pl+1+k-1-il,ls);//若有左子树,则递归 
    if(ir>k)right=build(k+1,ir,pl+k-il+1,pr,rs);//若有右子树,则递归
    if(ls!=rs)ans=false;//左右子树黑节点个数不同则置为false 
    sum=ls;
    if(root<0){//若当前结点是红色 
        if(left<0||right<0)ans=false;//此时若左孩子或右孩子是红色则置为false 
    }
    else sum++;//否则黑节点个数加一       
    return root;//返回根结点 
}
int main(){
    int k;
    cin>>k;
    while(k--){//k组 
        cin>>n;
        for(int i=0;i<n;i++){//输入先序序列 
            cin>>pre[i];
            in[i]=abs(pre[i]); 
        }
        sort(in,in+n);//得到中序序列 
        pos.clear();//每次用前需清空 
        for(int i=0;i<n;i++)pos[in[i]]=i;//记录在中序下的位置 
        ans=true; 
        int sum;//记录各结点到叶结点的黑结点数 
        int root=build(0,n-1,0,n-1,sum);//根结点 
        if(root<0)ans=false;//若根结点是红色,则置为false 
        if(ans)cout<<"Yes"<<endl;
        else cout<<"No"<<endl;
    }
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/527517.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++】类和对象(中)---拷贝构造函数、赋值运算符重载

个人主页&#xff1a;平行线也会相交&#x1f4aa; 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 平行线也会相交 原创 收录于专栏【C之路】&#x1f48c; 本专栏旨在记录C的学习路线&#xff0c;望对大家有所帮助&#x1f647;‍ 希望我们一起努力、成长&…

MySQL之MHA高可用集群及故障切换

目录 一、MHA概述1.1 MHA 的组成1.2 MHA 的特点1.3 MHA的工作原理1.4 故障切换时MHA会做什么 二、搭建MySQLMHA2.1 实验思路2.2 实验环境、安装包2.3 服务搭建2.3-1 所有服务器挂壁防火墙和安全增强2.3-2 修改 Master、Slave1、Slave2 节点的主机名2.3-3 修改三台MySQL服务器主…

『新星计划 • 数据结构与算法』数据结构学习指南以及在校招中的重要性

文章目录 &#x1f490;文章导读&#x1f490;导师自我介绍&#x1f490;数据结构与算法的重要性&#x1f513;在岗位招聘中&#x1f513;在校招笔试中&#x1f513;在校招面试中&#x1f513;在未来工作中 &#x1f490;数据结构与算法如何学习⤴️学习路线⤵️学习方法↪️几…

tinyWebServer 学习笔记——一、半同步半反应堆线程池

文章目录 一、基础知识1. 服务器编程基本框架2. 五种 I/O 模型3. 事件处理模式4. 半同步/半反应堆模式5. 线程池 二、代码解析1. 线程池类定义2. 线程池创建与回收3. 向请求队列中添加任务4. 线程处理函数5. run 执行任务 参考文献 一、基础知识 1. 服务器编程基本框架 服务器…

软件测试 自动化测试selenium篇(一)

目录 一、什么是自动化测试 单元测试 接口自动化 UI自动化 二、如何实施自动化测试 自动化测试需要了解的技能 三、selenium介绍 webdriver的工作原理&#xff1a; 四、SeleniumJava环境搭建 验证环境是否搭建成功 创建java项目&#xff0c;添加pom文件中添加依赖 常见问…

一些使用树莓派遇到的问题

在长达两个月的实习期&#xff0c;白天去公司实习&#xff0c;晚上回到实验室学习树莓派。终于简单的入门了。来做个总结。 目录 1. wifi问题 树莓派之wifi连接 2.vnc树莓派桌面问题 3.安装库或者下载东西时&#xff0c;域名无法解析。 4.进行安装或者操作时&#xff0c…

【Java多线程编程】解决线程的不安全问题之volatile关键字

目录 1. 造成线程不安全的代码 2. volatile能保证内存可见性 3. synchronized与volatile的区别 3.1 synchronized能保证原子性 3.2 volatile不能保证原子性 1. 造成线程不安全的代码 有一代码&#xff0c;要求两个线程运行。并自定义一个标志位 flag&#xff0c;当线程2&…

UVM学习——搭建简单的UVM平台

引言 本专栏的博客均与 UVM 的学习相关&#xff0c;学习参考&#xff1a; 【1】UVM Tutorial 【2】张强著&#xff0c;UVM实战 &#xff08;卷 Ⅰ&#xff09; 【3】Download UVM (Standard Universal Verification Methodology) 本专栏的学习基本依照 资料【2】的主线&#…

【机器学习】正规方程法求解线性回归问题

前情提要&#xff1a;https://blog.csdn.net/weixin_45434953/article/details/130604086 正规方程 正规方程能以更好的方式求得假设函数中 θ \theta θ的最优值。它提供了一种用于求 θ \theta θ的解析方法&#xff0c;而不是梯度下降那样的迭代方法。也就是只需要一次运算…

Microsoft Power BI连接本地mysql 数据库 !power bi提示此连接器需要安装一个或多个其他组件才能使用怎么办!

一、步骤 &#xff08;一&#xff09;从菜单栏点击进入mysql数据库 点击主页>获取数据>更多 选择mysql数据库&#xff0c;点击连接 &#xff08;二&#xff09;已经安装了mysql connector/net还是提示此连接器需要安装一个或多个其他组件才能使用-解决 重装了几次都…

vue-cli 关闭 Uncaught error 的全屏提示

在使用vue-cli开发项目的时候&#xff0c;如果代码抛出异常了&#xff0c;那么就会出现一个全屏的提示框&#xff0c;长下面这样&#xff1a; 经过一段时间的排查发现是webpack的问题&#xff0c;排查方式就是打开控制台&#xff0c;看这个框的一些属性&#xff0c;通常会有一些…

【DNDC模型】在土地利用变化、未来气候变化下的建模方法及温室气体时空动态模拟实践技术

DNDC&#xff08;Denitrification-Decomposition&#xff0c;反硝化-分解模型&#xff09;是目前国际上最为成功的模拟生物地球化学循环的模型之一&#xff0c;自开发以来&#xff0c;经过不断完善和改进&#xff0c;从模拟简单的农田生态系统发展成为可以模拟几乎所有陆地生态…

界面开发框架Qt新手入门教程 - 可编辑树模型的示例(一)

Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写&#xff0c;所有平台无差别运行&#xff0c;更提供了几乎所有开发过程中需要用到的工具。如今&#xff0c;Qt已被运用于超过70个行业、数千家企业&#xff0c;支持数百万设备及应用。 The Qt Company是Di…

考研日语-详解ている、てある、ていく、てくる用法

目录 一、ている用法 1. 表示现在状态 2. 表示持续动作 3. 表示经验或习惯 4. 表示结果或效果 二、てある用法 1. 表示已经完成的动作 2. 表示现在状态 3. 表示被动 三、ていく用法 1. 表示未来的动作 2. 表示逐渐变化的过程 四、てくる用法 1. 表示过去到现在的…

Python实现哈里斯鹰优化算法(HHO)优化XGBoost分类模型(XGBClassifier算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 2019年Heidari等人提出哈里斯鹰优化算法(Harris Hawk Optimization, HHO)&#xff0c;该算法有较强的全…

滴滴一面:BigKey问题很致命,如何排查和处理?

说在前面 在40岁老架构师 尼恩的读者社区(50)中&#xff0c;最近有小伙伴拿到了一线互联网企业如极兔、有赞、希音、百度、网易、滴滴的面试资格&#xff0c;遇到一几个很重要的面试题&#xff1a; 致命的的Redis BigKey 如何排查&#xff0c;你处理过吗&#xff1f; 与之类似…

Yield Guild Games: RON 质押来啦!

Yield Guild Games (YGG) 自 2022 年 7 月以来一直是 Ronin 区块链的验证者&#xff0c;在保障和维护网络方面发挥着至关重要的作用。随着 2023 年 4 月委托权益证明 (DPoS) 的推出&#xff0c;质押生态系统进一步民主化&#xff0c;允许更多的参与者在赚取奖励的同时为网络的安…

LabVIEWCompactRIO 开发指南19 原始以太网(TCP/UDP)

LabVIEWCompactRIO 开发指南19 原始以太网&#xff08;TCP/UDP&#xff09; TCP和UDP是所有以太网标准的低级构建块。原始TCP和UDP工具在几乎所有编程环境中都得到原生支持&#xff0c;包括LabVIEW。它们提供较低级别的通信功能&#xff0c;这些功能更灵活&#xff0c;但用户…

3.34 haas506 2.0开发教程-example -TFT显示自动生成的二维码

TFT显示自动生成的二维码 应用场景案例说明1.硬件2.连线图 代码源码链接[TFT显示二维码](https://www.yuque.com/haas506/wiki/pubazmzgrf30zws0) 应用场景 二维码在各个领域中的应用越来越广泛&#xff0c;其中一些主要应用场景包括&#xff1a; 电子商务&#xff1a;通过二维…

RHCSA之查看命令帮助手册

目录 RHCSA之查看命令帮助手册 查看命令类型 --- type Linux中对应的命令类型 帮助命令 help 命令 用法1 help 内部命令 用法2 命令 --help 命令的部分语法符号解析 man 命令 man命令用法 man的帮助级 man 命令帮助信息界面中的常用操作 man命令中帮助信息的结构以及意义…