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 ( ...
随机推荐
- python加载和使用java的类的方法
在开发python项目的时候,有时候会用的java的jar包 有这么几个python的三方包可以用: pyjnius:bug list:https://github.com/kivy/pyjnius/ ...
- C#使用全局钩子(hook),SetWindowsHookEx返回0、不回调的解决
http://www.csharpwin.com/csharpspace/3766r5747.shtml 在.net 2005平台下 在使用全局hook时,总是遇见SetWindowsHookEx的返 ...
- Windows系统下JAVA开发环境搭建
首先我们需要下载JDK(JAVA Development Kit),JDK是整个java开发的核心,它包含了JAVA的运行环境,JAVA工具和JAVA基础的类库. 下载地址:http://www.or ...
- 百度知道的代码复制粘贴到VB没有换行怎么办
在如下所示的网页中,复制 粘贴到word文档,换行还是有的 再复制到VB6.0中还是可用的
- Lvs 负载均衡 (VS/NAT模式)
一.LVS简介 LVS是 Linux Virtual Server 的简称,也就是Linux虚拟服务器.这是一个由章文嵩博士发起的一个开源项目,它的官方网站是 http://www.linuxvirt ...
- Codeforces Round #233 (Div. 2)D. Painting The Wall 概率DP
D. Painting The Wall ...
- HDU5465/BestCoder Round #56 (div.2) 二维树状数组
Clarke and puzzle 问题描述 克拉克是一名人格分裂患者.某一天,有两个克拉克(aa和bb)在玩一个方格游戏. 这个方格是一个n*mn∗m的矩阵,每个格子里有一个数c_{i, j}ci ...
- 各种comprehension
1 什么是comprehension list.set.dict.generator等本质上是集合.所以,数学上的集合的表示引入到python中,{x| x属于某个集合}. 所以,comprehens ...
- location.replace
[root@bigdata-server-01 ~]# curl www.baidu.com<!DOCTYPE html><!--STATUS OK--><html> ...
- go12---interface
package main /* 接口interface 接口是一个或多个方法签名的集合 只要某个类型拥有该接口的所有方法签名,即算实现该接口,无需显示 声明实现了哪个接口,这称为 Structural ...