https://pintia.cn/problem-sets/994805342720868352/problems/994805346063728640

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 1 Figure 2 Figure 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

代码:

#include <bits/stdc++.h>
using namespace std; const int maxn = 500;
int T, n; int preorder[maxn]; struct Node {
int child[2];
int blackCnt;
int value;
int color;
}s[maxn]; int root, sz, ans; int AddNode(int valAndcol) {
sz ++;
s[sz].value = abs(valAndcol);
s[sz].color = valAndcol >= 0;
return sz;
} void Build(int L, int R, int father, bool direction) {
int l1 = -1, r1 = -1;
int l2 = -1, r2 = -1; for(int i = L + 1; i <= R; i ++) {
if(abs(preorder[i]) < abs(preorder[L])) {
l1 = L + 1, r1 = i;
} else if(abs(preorder[i]) == abs(preorder[L])) {
ans = 0;
return;
} else {
if(l2 == -1) l2 = i, r2 = R;
}
} if(l1 != -1) {
for(int i = l1; i <= r1; i ++) {
if(abs(preorder[i]) >= abs(preorder[L])) {
ans = 0;
return;
}
}
} if(l2 != -1) {
for(int i = l2; i <= r2; i ++) {
if(abs(preorder[i]) <= abs(preorder[L])) {
ans = 0;
return;
}
}
} // left: [l1, r1], right: [l2, r2]
int currentNode = AddNode(preorder[L]);
father != -1 ? s[father].child[direction] = currentNode : root = currentNode;
if(l1 != -1) Build(l1, r1, currentNode, 0);
if(ans == 0) return;
if(l2 != -1) Build(l2, r2, currentNode, 1);
} void Initialize() {
ans = 1;
root = -1;
sz = 0;
for(int i = 0; i < maxn; i ++) {
s[i].child[0] = s[i].child[1] = s[i].color = -1;
s[i].blackCnt = s[i].value = 0;
}
} void dfs(int x) {
for(int i = 0; i < 2; i ++) {
if(s[x].child[i] != -1) {
dfs(s[x].child[i]);
if(ans == 0) return;
}
} if(s[x].child[0] != -1 &&
s[x].child[1] != -1 &&
s[s[x].child[0]].blackCnt != s[s[x].child[1]].blackCnt) {
ans = 0;
return;
} if(s[x].child[0] != -1) s[x].blackCnt = s[s[x].child[0]].blackCnt;
if(s[x].child[1] != -1) s[x].blackCnt = s[s[x].child[1]].blackCnt;
s[x].blackCnt += s[x].color;
} int main() {
scanf("%d", &T);
while(T --) {
scanf("%d", &n);
for(int i = 1; i <= n; i ++) {
scanf("%d", &preorder[i]);
} Initialize();
Build(1, n, -1, -1); /*
// Debug Information:
for(int i = 1; i <= sz; i ++) {
printf("Id: %d, L: %d, R: %d, val: %d, col: %d\n", i, s[i].child[0], s[i].child[1], s[i].value, s[i].color);
}
*/ // (1) Every node is either red or black. // (2) The root is black.
if(!s[root].color) ans = 0; // (3) Every leaf (NULL) is black. // (4) If a node is red, then both its children are black.
for(int i = 1; i <= sz; i ++) {
if(!s[i].color) {
if(s[i].child[0] != -1 && !s[s[i].child[0]].color) ans = 0;
if(s[i].child[1] != -1 && !s[s[i].child[1]].color) ans = 0;
}
} for(int i = 1; i <= n; i ++) {
for(int j = 0; j < 2; j ++) {
if(s[i].child[j] == -1) {
s[i].child[j] = AddNode(0);
}
}
} // (5) For each node, all simple paths from the node to descendant leaves contain the same number of black nodes.
dfs(root); printf("%s\n", ans ? "Yes" : "No");
}
return 0;
}

 

PAT 甲级 1135 Is It A Red-Black Tree的更多相关文章

  1. PAT甲级1123. Is It a Complete AVL Tree

    PAT甲级1123. Is It a Complete AVL Tree 题意: 在AVL树中,任何节点的两个子树的高度最多有一个;如果在任何时候它们不同于一个,则重新平衡来恢复此属性.图1-4说明了 ...

  2. 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 ...

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

  4. PAT甲级——1135 Is It A Red-Black Tree (30 分)

    我先在CSDN上面发表了同样的文章,见https://blog.csdn.net/weixin_44385565/article/details/88863693 排版比博客园要好一些.. 1135 ...

  5. PAT甲级1135 Is It A Red-Black Tree?【dfs】

    题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805346063728640 题意: 给定一棵二叉搜索树的先序遍历结 ...

  6. 【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 ...

  7. PAT甲级1123 Is It a Complete AVL Tree【AVL树】

    题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805351302414336 题意: 给定n个树,依次插入一棵AVL ...

  8. PAT 甲级 1043 Is It a Binary Search Tree

    https://pintia.cn/problem-sets/994805342720868352/problems/994805440976633856 A Binary Search Tree ( ...

  9. PAT甲级——1123 Is It a Complete AVL Tree (完全AVL树的判断)

    嫌排版乱的话可以移步我的CSDN:https://blog.csdn.net/weixin_44385565/article/details/89390802 An AVL tree is a sel ...

随机推荐

  1. 【转】MySQL 当记录不存在时insert,当记录存在时update

    MySQL当记录不存在时insert,当记录存在时更新:网上基本有三种解决方法 第一种: 示例一:insert多条记录 假设有一个主键为 client_id 的 clients 表,可以使用下面的语句 ...

  2. python opencv show图片,debug技巧

    debug的时候可以直接把图片画出来debug. imshow函数就是python opencv的展示图片的函数,第一个是你要起的图片名,第二个是图片本身.waitKey函数是用来展示图片多久的,默认 ...

  3. linux如何查看端口被哪个进程占用

    1.lsof -i:端口号 2.netstat -tunlp|grep 端口号 都可以查看指定端口被哪个进程占用的情况 工具/原料   linux,windows xshell 方法/步骤     [ ...

  4. Java Web 项目目录结构

    为了使 Web 容器顺利地执行 Web 应用,开发者需要以一种标准的方式将 Web 项目中的资源(Servlets.JSP 等)打包.一个 Web 项目的目录结构可分为两种: 发布目录结构 Web 容 ...

  5. Python Tornado集成JSON Web Token方式登录

    本项目github地址 前端测试模板如下: Tornado restful api 项目 项目结构如下: 项目组织类似于django,由独立的app模块构成. 登录接口设计 模式:post -> ...

  6. 个人向 - vscode插件记录

    现在用的编译器的是vscode,本身这个编译器很小,很多功能都没有,需要自己下载一些插件来完善功能,不知不觉下载的插件也有三十多个了,感觉需要记录一下. tips:1. vscode插件的安装位置:’ ...

  7. 关于Nginx理解

    由于微信小程序要使用Https,但是又不能修改已有线上的配置.所以最简单的方法就是使用nginx转发,在nginx上使用https,然后再转发到内部服务器.Nginx由于其优良的性能.一台4核16GB ...

  8. cisco ospf

    ospf配置:(Open Shortest Path First)PC0 and PC1 via Ospf to communicate. Network map as below.Environme ...

  9. #ifdef __cplusplus extern "C" { #endif”的定义

      平时我们在linux c平台开发的时候,引用了一些Cpp或者C的代码库,发现一些头文件有如下代码条件编译. #ifdef __cplusplus extern "C" { #e ...

  10. 【Codeforces Round 1114】Codeforces #538 (Div. 2)

    Codeforces Round 1114 这场比赛做了\(A\).\(C\).\(D\).\(E\),排名\(134\). \(B\)题做了很长时间,好不容易最后一分钟\(Pretest\ Pass ...