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 ( ...
随机推荐
- Mybatis 增强工具包 Mybatis-Plus
原文:https://www.oschina.net/p/mybatis-plus
- CSS3的animation功能
旋转动画 <img src="https://facebook.github.io/react/img/logo.svg" class="App-logo" ...
- 功能超级强大的网络工具nc
摘自:http://www.linuxso.com/command/nc.html 功能说明:功能强大的网络工具语 法:nc [-hlnruz][-g<网关...>][-G<指向器数 ...
- HDU1215--七夕节
找出小于N的全部因子的和,N比較大,非常明显要打表来做,不然肯定会超时 方法就是枚举范围内每一个整数.然后再枚举范围内这个整数的全部的倍数,加上这个数 由于这个整数的倍数中一定含有这个整数因子,这样速 ...
- hbase shell经常使用命令
hbase经常使用命令 /usr/local/cloud/hbase/bin/hbase shell 用shell来连接hbase exit 退出hbase shell version 查看hbase ...
- ubuntu14.04 的ibus不能卸载(安装fcitx输入法框架时可能有这个需求)。出现无system setting有用程序
每年的ubuntu新版本号公布,都会吸引一大批热血青年. 关注越多也让ubuntu越来越好了. 使用ubuntu的人都会在安装系统之后马上安装顺手的输入法,也可能不会.看人. 安装输入法,对于中文输入 ...
- Android学习笔记-保存数据的实现方法2-SharedPreferences
Android下,数据的保存,前面介绍过了,把数据保存到内存以及SD卡上,这次我们就介绍一下,更为常用的采用SharedPreferences的方式来保存数据, 1,得到SharedPreferenc ...
- YTU 2507: 李白打酒
2507: 李白打酒 时间限制: 1 Sec 内存限制: 128 MB 提交: 414 解决: 186 题目描述 话说大诗人李白,一生好饮.幸好他从不开车. 一天,他提着酒壶,从家里出来,酒壶中 ...
- Unity3D游戏,TCP,WEBCOSKT,HTTP通信架构 weaving-socket
weaving-socket 详细介绍 项目简介 2017-8-8:新发布功能 增加U3D游戏客户的通讯项目支持,并提供示例内容. 2017-5-5: 新发布 weaving-socket 架构的.n ...
- 用C语言实现websocket服务器
Websocket Echo Server Demo 背景 嵌入式设备的应用开发大都依靠C语言来完成,我去研究如何用c语言实现websocket服务器也是为了在嵌入式设备中实现一个ip camera的 ...