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

题目大意:这道题要求判断给出的树是不是红黑树,用节点值加负号的方式表示红色节点。其中红黑树需要满足三个主要条件:(1)根节点是黑色 (2)红色节点的子节点均为黑色节点(包括NULL) (3) 所有从根节点到叶子节点的路径上经过的黑色节点数目相同。

主要思路:题目考查的其实与红黑树关系不大,主要是二叉查找树的建立和遍历。首先根据给出的一系列节点创建二叉树,这里用到的是最基本的性质,左子树节点的值小于根节点的值且小于右子树节点的值,利用递归的方法将给出的节点插入树中。创建好之后,再利用递归的先序遍历对以上要求一一判断即可完成。

#include <iostream>
#include <cstdlib>
#include <cmath>
using namespace std; typedef struct node {
int val;
struct node * left;
struct node * right;
} Node;
Node * root; //根节点
int num_black; //黑色节点数量
bool is_red_black; //是否是红黑树 //动态分配新的节点
Node * new_node(int val) {
Node * p = (Node *) malloc(sizeof(Node));
p->val = val;
p->left = NULL;
p->right = NULL;
return p;
} //添加节点
Node * add_node(Node * node, int val) {
if (node == NULL) return new_node(val);
if (abs(val) < abs(node->val))
node->left = add_node(node->left, val);
else
node->right = add_node(node->right, val);
return node;
}
void add(int val) {
root = add_node(root, val);
} //先序遍历
void travel(Node * node, int num) {
if (!is_red_black) return; //如果已经发现不是红黑树,停止后面的递归
if (node == NULL) { //遍历到NULL以后,判断路径中的黑色节点数是否与之前一致
if (num_black == 0)
num_black = num;
else if (num_black != num)
is_red_black = false;
return;
}
if (node->val < 0) { //红色节点:子节点必须为黑色节点(或NULL)
if ((node->left != NULL && node->left->val < 0) || (node->right != NULL && node->right->val < 0))
is_red_black = false;
}
else //黑色节点:计数+1
num++;
travel(node->left, num);
travel(node->right, num);
} int main(void) {
int k, n, i, j; cin >> k;
for (i = 0; i < k; i++) {
root = NULL;
num_black = 0;
is_red_black = true; cin >> n;
//创建二叉树
for (j = 0; j < n; j++) {
int v;
cin >> v;
add(v);
}
if (root->val < 0) //红黑树根节点为黑色
is_red_black = false;
travel(root, 0);
if (is_red_black)
printf("Yes\n");
else
printf("No\n");
} 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. PAT甲级|1151 LCA in a Binary Tree 先序中序遍历建树 lca

    给定先序中序遍历的序列,可以确定一颗唯一的树 先序遍历第一个遍历到的是根,中序遍历确定左右子树 查结点a和结点b的最近公共祖先,简单lca思路: 1.如果a和b分别在当前根的左右子树,当前的根就是最近 ...

  3. PAT 1043 Is It a Binary Search Tree (25分) 由前序遍历得到二叉搜索树的后序遍历

    题目 A Binary Search Tree (BST) is recursively defined as a binary tree which has the following proper ...

  4. 【PAT甲级】1102 Invert a Binary Tree (25 分)(层次遍历和中序遍历)

    题意: 输入一个正整数N(<=10),接着输入0~N-1每个结点的左右儿子结点,输出这颗二叉树的反转的层次遍历和中序遍历. AAAAAccepted code: #define HAVE_STR ...

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

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

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

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

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

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

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

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

随机推荐

  1. 编写管理IP地址参数脚本(永久性)

    1.用各种命令取出/etc/passwd文件前5行的最后一个字母.(2种) 2.编写管理IP地址参数脚本(永久性) a.只能用sed命令完成 b.提示用户变量赋值(IP.子网掩码.网关.DNS等) c ...

  2. JS代码规范

    JS代码规范 空格 二元运算符两侧必须有一个空格,一元运算符与操作对象之间不允许有空格. var a = !arr.length; a++; a = b + c; 复制代码 用作代码块起始的左花括号 ...

  3. python实现二分叉查找

    *二分叉查找就是折半查找 比如12345这几个数字当中找2,他会先找到这五个数字中的中坚的那个与2进行比较,比如中间的3>2他就认为3以后的不用查找了,然后查找3左边的,即123,再把这个分半, ...

  4. 【STM32 .Net MF开发板学习-05】PC通过Modbus协议远程操控开发板

    从2002年就开始接触Modbus协议,以后陆续在PLC.DOS.Windows..Net Micro Framework等系统中使用了该协议,在我以前写的一篇博文中详细记载了这一段经历,有兴趣的朋友 ...

  5. 在Jetson TX2上捕获、显示摄像头视频

    参考文章:How to Capture and Display Camera Video with Python on Jetson TX2 与参考文章大部分都是相似的,如果不习惯看英文,可以看看我下 ...

  6. Linux下swap到底有没有必要使用

    周五看到QQ群里在讨论Linux主机上到底需不需要开启swap空间,而且目前公有云主机默认都是把swap关了的,很多公司也是没有开启swap,那到底需不需要开启呢? 我之前在看<鸟哥的Linux ...

  7. E. Count The Blocks

    E. Count The Blocks 这是一个计数题,又把我卡自闭了...之前也碰到过类似的题目,这次居然还没有写出来,感觉自己还是太菜了,加油补题吧. 题目大意: 给你一个数字 \(n\),代表的 ...

  8. C# 基础知识系列- 17 小工具优化

    0. 前言 不知道有没有动手能力强的小伙伴照着上一篇的内容写过程序呢?如果有的话,应该会在使用的时候发现以下几个问题: 每次启动都需要经过漫长的时间去遍历磁盘里的文件目录 因为数据是用的字典保存的,所 ...

  9. 【HBase】HBase和Sqoop整合

    目录 需求一 步骤 一.修改sqoop配置文件 二.在mysql中创建数据库和数据表并插入数据 三.将mysql表中的数据导入到HBase表中 四.在HBase表中查看数据 需求二 步骤 一.创建hi ...

  10. Day_09【常用API】扩展案例5_获取长度为5的随机字符串,字符串由随机的4个大写英文字母和1个0-9之间(包含0和9)的整数组成

    分析以下需求,并用代码实现 1.定义String getStr(char[] chs)方法 功能描述:获取长度为5的随机字符串,字符串由随机的4个大写英文字母和1个0-9之间(包含0和9)的整数组成 ...