PAT 甲级1135. Is It A Red-Black Tree (30)
链接:1135. Is It A Red-Black Tree (30)
红黑树的性质:
(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.
翻译:
(1)红黑树节点只能为红或者黑
(2)根节点是黑
(3)null为黑,表示叶子节点(没有child的节点为叶子节点)可以为红为黑。如果条件改为null节点为红,则叶子节点必须为黑。
(4)如果该节点为红,child节点都为黑。
(5)从根节点到叶子节点的每条路径上的总black节点数都相等。第5点的原意是每个节点到叶子节点的路径上的black节点数都相等,跟根节点到叶子节点的意思一样,而且从根节点计算更方便。因为每个节点到叶子节点上的路径都是根节点到叶子节点路径的一部分。
吐槽:这次PAT考试由于延考一个小时,又加上临时该题,题目出的真的不咋地,4道题目都是题意不清,全靠不断的猜和提交代码测试,才逐渐摸索出题意。虽然只考了91分,但是没接触过红黑树,做不出也可以原谅哈。
理解了红黑树的性质,题目就变得简单,第一步根据先序遍历构造数,由于红黑树是BST树(BST的性质:左孩子比父节点小,右孩子比父节点大),所以已知一个先序就可以很快的构造了。第二步使用dfs来判断是否红黑树就行了。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std; int n,a[]; struct Node
{
int val;
int bBlack;
int lBlackNum;
int rBlackNum;
int tBlackNum;
Node* left;
Node* right;
Node()
{
left = right = ;
lBlackNum = rBlackNum = tBlackNum = ;
}
void setVal(int iVal)
{
if(iVal > ) bBlack = ;
else if(iVal < )bBlack = ;
val = abs(iVal);
}
}; Node* CreateTree(int l,int r)
{
if(l > r) return NULL;
Node* nd = new Node();
nd -> setVal(a[l]);
int i = l+;
for(;i<=r;++i)
if(abs(a[i]) > abs(a[l])) break;
nd -> left = CreateTree(l+,i-);
nd -> right = CreateTree(i,r);
return nd;
} void DelTree(Node **nd)
{
if(*nd == NULL) return;
DelTree(&(*nd)->left);
DelTree(&(*nd)->right);
delete *nd;
*nd = ;
}
bool bIsTree = true; int lastnum = -;
void dfs(Node* nd,int cnt)
{
if(!bIsTree) return;
if(nd == NULL)
{
if(lastnum == -) lastnum = cnt;
else if(lastnum != cnt){bIsTree = false;}
return;
}
if(nd->bBlack) ++cnt;
else
{
if(nd->left&&!nd->left->bBlack) bIsTree = false;
if(nd->right&&!nd->right->bBlack) bIsTree = false;
}
dfs(nd->left,cnt);
dfs(nd->right,cnt); } int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i=;i<n;++i)
scanf("%d",&a[i]);
Node* root = CreateTree(,n-);
bIsTree = root->bBlack;
lastnum = -; //初始化会忘
dfs(root,);
if(bIsTree) printf("Yes\n");
else printf("No\n");
DelTree(&root); //清理内存也很重要,因为很多公司会看代码,这一行代码有加分。
}
return ;
}
以下是一种更加简便的创建红黑树的方法,判断过程不变。该方法由同样热爱编程的网友提供。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std; struct Node
{
int val;
int bBlack;
Node* left;
Node* right;
Node()
{
left = right = 0;
}
void setVal(int iVal)
{
if(iVal > 0) bBlack = 1;
else if(iVal < 0)bBlack = 0;
val = abs(iVal);
}
}; Node* Insert(Node *root,int val)
{
if(NULL == root){
root = new Node();
root->setVal(val);
return root;
}
if(abs(val) < root->val){
root->left = Insert(root->left,val);
}else
root->right = Insert(root->right,val);
return root;
} void DelTree(Node **nd)
{
if(*nd == NULL) return;
DelTree(&(*nd)->left);
DelTree(&(*nd)->right);
delete *nd;
*nd = 0;
}
bool bIsTree = true; int lastnum = -1;
void dfs(Node* nd,int cnt)
{
if(!bIsTree) return;
if(nd == NULL)
{
if(lastnum == -1) lastnum = cnt;
else if(lastnum != cnt){bIsTree = false;}
return;
}
if(nd->bBlack) ++cnt;
else
{
if(nd->left&&!nd->left->bBlack) bIsTree = false;
if(nd->right&&!nd->right->bBlack) bIsTree = false;
}
dfs(nd->left,cnt);
dfs(nd->right,cnt); }
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int a,n;
scanf("%d",&n);
Node* root = NULL;
for(int i=0;i<n;++i)
{
scanf("%d",&a);
root = Insert(root,a);
}
bIsTree = root->bBlack;
lastnum = -1; //初始化会忘
dfs(root,0);
if(bIsTree) printf("Yes\n");
else printf("No\n");
DelTree(&root); //清理内存也很重要,因为很多公司会看代码,这一行代码有加分。
}
return 0;
}
PAT 甲级1135. Is It A Red-Black Tree (30)的更多相关文章
- 【PAT甲级】1099 Build A Binary Search Tree (30 分)
题意: 输入一个正整数N(<=100),接着输入N行每行包括0~N-1结点的左右子结点,接着输入一行N个数表示数的结点值.输出这颗二叉排序树的层次遍历. AAAAAccepted code: # ...
- PAT甲级1123. Is It a Complete AVL Tree
PAT甲级1123. Is It a Complete AVL Tree 题意: 在AVL树中,任何节点的两个子树的高度最多有一个;如果在任何时候它们不同于一个,则重新平衡来恢复此属性.图1-4说明了 ...
- pat 甲级 1135. Is It A Red-Black Tree (30)
1135. Is It A Red-Black Tree (30) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yu ...
- PAT甲级——1135 Is It A Red-Black Tree (30 分)
我先在CSDN上面发表了同样的文章,见https://blog.csdn.net/weixin_44385565/article/details/88863693 排版比博客园要好一些.. 1135 ...
- PAT 甲级 1135 Is It A Red-Black Tree
https://pintia.cn/problem-sets/994805342720868352/problems/994805346063728640 There is a kind of bal ...
- PAT甲级1135 Is It A Red-Black Tree?【dfs】
题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805346063728640 题意: 给定一棵二叉搜索树的先序遍历结 ...
- 【PAT 甲级】1151 LCA in a Binary Tree (30 分)
题目描述 The lowest common ancestor (LCA) of two nodes U and V in a tree is the deepest node that has bo ...
- PAT甲级1123 Is It a Complete AVL Tree【AVL树】
题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805351302414336 题意: 给定n个树,依次插入一棵AVL ...
- PAT 甲级 1043 Is It a Binary Search Tree
https://pintia.cn/problem-sets/994805342720868352/problems/994805440976633856 A Binary Search Tree ( ...
随机推荐
- PHP关于文件与文件夹(1) 写入文件 文件权限 三、锁定文件
一.文件权限 总之中的一个切都是为了保证文件夹的安全,保证文件夹的安全比保证文件的安全更重要. 二.写入文件 file_put_contents($file,$data); //假设没有的话会创建. ...
- C# 插件热插拔 .NET:何时应该 “包装异常”? log4.net 自定义日志文件名称
C# 插件热插拔 所谓热插拔就是插件可以 在主程序不重新启动的情况直接更新插件, 网上有很多方案: https://www.cnblogs.com/happyframework/p/3405811 ...
- 工作总结 2018 - 4 - 13 select标签 multiple 属性 同时选择多个选项
<div class="col-xs-4"> @Html.DropDownList("CustomerType", (MultiSelectList ...
- RELU 激活函数及其他相关的函数
RELU 激活函数及其他相关的函数 转载 2016年07月21日 20:51:17 45778 本博客仅为作者记录笔记之用,不免有很多细节不对之处. 还望各位看官能够见谅,欢迎批评指正. 更多相关博客 ...
- mac终端配置Android ADB命令
不得不说mac是一款开发利器,不仅可以开发ios,而且对于Android开发也是不错的选择,下面我就对mac配置adb命令,进行简要的说明.下面我将一下mac环境下的配置步骤:1.在自己的目录(hom ...
- 使用-Wl直接向ld传递参数
gcc -Wl, key1, value1, key2, value2, key3, value3 包括-Wl在内全部都是以逗号分隔. 上面等价于: ld key1=value1 key2=value ...
- 【Dairy】2016.10.20 生日记
今天又有人生日耶(朱子鸿)~破壳快乐! 遥犇献歌一曲<就是现在>掌声!!!!!! 开森,呲到了草莓蛋糕,很好呲的.. 然后下去跑步,拿着奶油叉子,往卜卜脸上抹,可惜zks吸引不够(坑队友) ...
- bzoj 1370 Gang团伙
题目大意: 在某城市里住着n个人,任何两个认识的人不是朋友就是敌人,满足 1. 我朋友的朋友是我的朋友 2. 我敌人的敌人是我的朋友 所有是朋友的人组成一个团伙 告诉你关于这n个人的m条信息,即某两个 ...
- CAS和Oauth2的区别
CAS是单点登陆(SSO) Oauth2是对某种资源进行授权访问
- 基于Numpy的神经网络+手写数字识别
基于Numpy的神经网络+手写数字识别 本文代码来自Tariq Rashid所著<Python神经网络编程> 代码分为三个部分,框架如下所示: # neural network class ...