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<iostream> //偏难
#include<vector>
#include<math.h>
using namespace std;
struct node{
int val;
node* left;
node* right;
node(int v):val(v), left(NULL), right(NULL){
}
};
vector<int> a, pre;
int cnt=0, flag=0;
node* buildtree(node* t, int b, int e){
if(b>e) return NULL;
t=new node(a[b]);
int i=b+1;
while(i<=e&&abs(a[i])<abs(a[b])) i++;
t->left=buildtree(t->left, b+1, i-1);
t->right=buildtree(t->right, i, e);
return t;
}
bool isBTree(node* root, int num){
if(!root)
if(num!=cnt)
return false;
else
return true;
if(root->val>0) num++;
else{
if(root->right&&root->right->val<0) return false;
if(root->left&&root->left->val<0) return false;
}
return isBTree(root->left, num)&&isBTree(root->right, num);
}
int main(){
int k, n;
cin>>k;
for(int i=0; i<k; i++){
cin>>n;
a.clear();
a.resize(n);
cnt=0;
for(int j=0; j<n; j++)
cin>>a[j];
node* root=NULL;
root=buildtree(root, 0, n-1);
node* temp=root;
while(temp){
cnt=(temp->val>0?cnt+1:cnt);
temp=temp->left;
}
if(isBTree(root, 0)&&root->val>0)
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
return 0;
}

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

  1. PAT A1135 Is It A Red Black Tree

    判断一棵树是否是红黑树,按题给条件建树,dfs判断即可~ #include<bits/stdc++.h> using namespace std; ; struct node { int ...

  2. [转载] 红黑树(Red Black Tree)- 对于 JDK TreeMap的实现

    转载自http://blog.csdn.net/yangjun2/article/details/6542321 介绍另一种平衡二叉树:红黑树(Red Black Tree),红黑树由Rudolf B ...

  3. Red–black tree ---reference wiki

    source address:http://en.wikipedia.org/wiki/Red%E2%80%93black_tree A red–black tree is a type of sel ...

  4. Red Black Tree 红黑树 AVL trees 2-3 trees 2-3-4 trees B-trees Red-black trees Balanced search tree 平衡搜索树

    小结: 1.红黑树:典型的用途是实现关联数组 2.旋转 当我们在对红黑树进行插入和删除等操作时,对树做了修改,那么可能会违背红黑树的性质.为了保持红黑树的性质,我们可以通过对树进行旋转,即修改树中某些 ...

  5. PAT甲级:1066 Root of AVL Tree (25分)

    PAT甲级:1066 Root of AVL Tree (25分) 题干 An AVL tree is a self-balancing binary search tree. In an AVL t ...

  6. PAT甲级:1064 Complete Binary Search Tree (30分)

    PAT甲级:1064 Complete Binary Search Tree (30分) 题干 A Binary Search Tree (BST) is recursively defined as ...

  7. CF1208H Red Blue Tree

    CF1208H Red Blue Tree 原本应该放在这里但是这题过于毒瘤..单独开了篇blog 首先考虑如果 $ k $ 无限小,那么显然整个树都是蓝色的.随着 $ k $ 逐渐增大,每个点都会有 ...

  8. PAT 1135 Is It A Red-Black Tree[难]

    1135 Is It A Red-Black Tree (30 分) There is a kind of balanced binary search tree named red-black tr ...

  9. 【刷题-PAT】A1135 Is It A Red-Black Tree (30 分)

    1135 Is It A Red-Black Tree (30 分) There is a kind of balanced binary search tree named red-black tr ...

随机推荐

  1. div标签的闭合检查

    什么叫DIV标签有没有闭合呢?有<div>开头就应该有</div>来结尾闭合了.有时候写代码写 了<div>,忘记</div>结尾,谓之没有闭合也. 如 ...

  2. System.Drawing.Color的几种使用方法

    System.Drawing.Color   cl   =   Color.Red; System.Drawing.Color   cl   =   Color.FromArgb(255,0,0); ...

  3. 【杂文】C++头文件加速

    [杂文]C++头文件加速 骚年,冲钱送开挂哦,可以助你超神于OI战场 如果你发现你的暴力超时了的话,可以尝试用一下头文件加速,说不定就过了呢! #pragma once//只编译一次 #pragma ...

  4. Java多线程(九) synchronized 锁对象的改变

    public class MyService { private String lock = "123"; public void testMethod() { synchroni ...

  5. JS数组、outerHtml、className

    //对象转换为数组function obj(){for(var i=0;i<arguments.length;i++){ this[i]=arguments[i]; }} var o2=new ...

  6. jquery 菜单展开与收缩参考脚本

    /* * metismenu - v1.1.3 * Easy menu jQuery plugin for Twitter Bootstrap 3 * https://github.com/onoku ...

  7. 如何把mysql的列修改成行显示数据简单实现

    如何把mysql的列修改成行显示数据简单实现 创建测试表: 1: DROP TABLE IF EXISTS `test`; 2: CREATE TABLE `test` ( 3: `year` int ...

  8. HanLP自然语言处理包开源(包含源码)

    支持中文分词(N-最短路分词.CRF分词.索引分词.用户自定义词典.词性标注),命名实体识别(中国人名.音译人名.日本人名.地名.实体机构名识别),关键词提取,自动摘要,短语提取,拼音转换,简繁转换, ...

  9. RabbitMQ - Publisher的消息确认机制

    queue和consumer之间的消息确认机制:通过设置ack.那么Publisher能不到知道他post的Message有没有到达queue,甚至更近一步,是否被某个Consumer处理呢?毕竟对于 ...

  10. Vue指令6:v-show

    根据表达式的真假值来渲染元素 用法大致一样: <h1 v-show="ok">Hello!</h1> 不同的是带有 v-show 的元素始终会被渲染并保留在 ...