1135. Is It A Red-Black Tree (30)[红黑树判断]

2023-12-02 15:48

本文主要是介绍1135. Is It A Red-Black Tree (30)[红黑树判断],希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 原题: https://www.patest.cn/contests/pat-a-practise/1135、

2. 思路:

题意: 判断一棵二叉树是否红黑树。 树的遍历问题。
思路:
题目已经给出了判断条件,根据条件判断即可。
主要时条件4和5的判断。
1. 首先要建树了。
对于BST构建,原则上有两种。
传统的前序和中序建树。
另一种,由于BST的特殊性,即左边小于当前结点值,右边的大于当前结点值。
利用这一特性可以递归建树。
这里用第二种方便。
2.
判断条件4, 用递归判断即可。
3.
判断条件5, 同样递归判断,左树和右树的黑色结点数相等则符合。
已AC

3. 源码

#include <iostream>
#include <cstring>
using namespace std;struct Node
{Node(int x) : data(x), left(NULL), right(NULL) {}int data;Node *left, *right;
};
Node *T = NULL;	//根结点void Build(Node *&T, int x);	//***构建二叉搜索树
bool JudgeNode(Node *T);	//***判断条件4
int JudgeNum(Node *T);	//*** 判断条件5int main()
{//freopen("in.txt", "r", stdin);int N, k, tmp;scanf("%d", &N);for (int i = 0; i < N; i++){T = NULL;scanf("%d", &k);for (int j = 0; j < k; j++){scanf("%d", &tmp);Build(T, tmp);//***构建二叉搜索树}if (T->data > 0 && JudgeNode(T) && JudgeNum(T) > -1){printf("Yes\n");}else{printf("No\n");}}return 0;
}void Build(Node *&T, int x)//***构建二叉搜索树
{if (T == NULL){T = new Node(x);}else if (abs(x) < abs(T->data)){Build(T->left, x);}else{Build(T->right, x);}return;
}bool JudgeNode(Node *T)//***判断条件4
{if (T == NULL)return true;if (T->data < 0){if (T->left != NULL && (T->left->data < 0))return false;if (T->right != NULL && (T->right->data < 0))return false;}return (JudgeNode(T->left) && JudgeNode(T->right));
}int JudgeNum(Node *T)	
{if (T == NULL)return 0;int left = JudgeNum(T->left);	//***返回值-1 表示不符合, 大于0为黑色结点数int right = JudgeNum(T->right);if (left < 0 || right < 0 || left != right){return -1;}else{if (T->data > 0)return (left + 1);elsereturn left;}
}


这篇关于1135. Is It A Red-Black Tree (30)[红黑树判断]的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/445911

相关文章

30常用 Maven 命令

Maven 是一个强大的项目管理和构建工具,它广泛用于 Java 项目的依赖管理、构建流程和插件集成。Maven 的命令行工具提供了大量的命令来帮助开发人员管理项目的生命周期、依赖和插件。以下是 常用 Maven 命令的使用场景及其详细解释。 1. mvn clean 使用场景:清理项目的生成目录,通常用于删除项目中自动生成的文件(如 target/ 目录)。共性规律:清理操作

poj 3259 uva 558 Wormholes(bellman最短路负权回路判断)

poj 3259: 题意:John的农场里n块地,m条路连接两块地,w个虫洞,虫洞是一条单向路,不但会把你传送到目的地,而且时间会倒退Ts。 任务是求你会不会在从某块地出发后又回来,看到了离开之前的自己。 判断树中是否存在负权回路就ok了。 bellman代码: #include<stdio.h>const int MaxN = 501;//农场数const int

2024网安周今日开幕,亚信安全亮相30城

2024年国家网络安全宣传周今天在广州拉开帷幕。今年网安周继续以“网络安全为人民,网络安全靠人民”为主题。2024年国家网络安全宣传周涵盖了1场开幕式、1场高峰论坛、5个重要活动、15场分论坛/座谈会/闭门会、6个主题日活动和网络安全“六进”活动。亚信安全出席2024年国家网络安全宣传周开幕式和主论坛,并将通过线下宣讲、创意科普、成果展示等多种形式,让广大民众看得懂、记得住安全知识,同时还

zoj 1721 判断2条线段(完全)相交

给出起点,终点,与一些障碍线段。 求起点到终点的最短路。 枚举2点的距离,然后最短路。 2点可达条件:没有线段与这2点所构成的线段(完全)相交。 const double eps = 1e-8 ;double add(double x , double y){if(fabs(x+y) < eps*(fabs(x) + fabs(y))) return 0 ;return x + y ;

POJ1269 判断2条直线的位置关系

题目大意:给两个点能够确定一条直线,题目给出两条直线(由4个点确定),要求判断出这两条直线的关系:平行,同线,相交。如果相交还要求出交点坐标。 解题思路: 先判断两条直线p1p2, q1q2是否共线, 如果不是,再判断 直线 是否平行, 如果还不是, 则两直线相交。  判断共线:  p1p2q1 共线 且 p1p2q2 共线 ,共线用叉乘为 0  来判断,  判断 平行:  p1p

Codeforces Round #113 (Div. 2) B 判断多边形是否在凸包内

题目点击打开链接 凸多边形A, 多边形B, 判断B是否严格在A内。  注意AB有重点 。  将A,B上的点合在一起求凸包,如果凸包上的点是B的某个点,则B肯定不在A内。 或者说B上的某点在凸包的边上则也说明B不严格在A里面。 这个处理有个巧妙的方法,只需在求凸包的时候, <=  改成< 也就是说凸包一条边上的所有点都重复点都记录在凸包里面了。 另外不能去重点。 int

【408DS算法题】039进阶-判断图中路径是否存在

Index 题目分析实现总结 题目 对于给定的图G,设计函数实现判断G中是否含有从start结点到stop结点的路径。 分析实现 对于图的路径的存在性判断,有两种做法:(本文的实现均基于邻接矩阵存储方式的图) 1.图的BFS BFS的思路相对比较直观——从起始结点出发进行层次遍历,遍历过程中遇到结点i就表示存在路径start->i,故只需判断每个结点i是否就是stop

linux 判断某个命令是否安装

linux 判断某个命令是否安装 if ! [ -x "$(command -v git)" ]; thenecho 'Error: git is not installed.' >&2exit 1fi

论文翻译:ICLR-2024 PROVING TEST SET CONTAMINATION IN BLACK BOX LANGUAGE MODELS

PROVING TEST SET CONTAMINATION IN BLACK BOX LANGUAGE MODELS https://openreview.net/forum?id=KS8mIvetg2 验证测试集污染在黑盒语言模型中 文章目录 验证测试集污染在黑盒语言模型中摘要1 引言 摘要 大型语言模型是在大量互联网数据上训练的,这引发了人们的担忧和猜测,即它们可能已

树(Tree)——《啊哈!算法》

树 什么是树?树是一种特殊的图,不包含回路的连通无向树。 正因为树有着“不包含回路”这个特点,所以树就被赋予了很多特性。 一棵树中的任意两个结点有且仅有唯一的一条路径连通。一棵树如果有n个结点,那么它一定恰好有n-1条边。在一棵树中加一条边将会构成一个回路。 一棵树有且只有一个根结点。 没有父结点的结点称为根结点(祖先)。没有子结点的结点称为叶结点。如果一个结点既不是根结点也不是叶