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. CSS开发技巧(四):解决flex多行布局的行间距异常、子元素高度拉伸问题

    在使用flex布局时,若出现换行,有两种较为特殊的现象是值得我们研究的: 子元素高度被拉伸,其实际高度大于它的内容高度. 各行子元素之间的行间距过大,甚至我们根本没有给子元素设置margin. 现在我 ...

  2. PHP的闭包和匿名函数

    闭包函数是创建时,封装周围状态的函数,而匿名函数是没有名称的函数,匿名函数可以被赋值给变量,也就是所谓的函数式编程,也可以传递参数,经常作为回调函数.(理论上讲:匿名函数和闭包不算是一个概念,php却 ...

  3. Spring绑定请求参数过程以及使用@InitBinder来注册自己的属性处理器

    在工作中,经常会出现前台的请求参数由于无法被正常转型,导致请求无法进到后台的问题. 比如,我有一个User.其性别的属性被定义成了枚举,如下: public enum Gender { MALE(&q ...

  4. 团队一致性的PHP开发环境之Docker

    docker php环境模型 docker 简介 Docker 是一个开源的应用容器引擎 让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现 ...

  5. spark系列-7、spark调优

    官网说明:http://spark.apache.org/docs/2.1.1/tuning.html#data-serialization 一.JVM调优 1.1.Java虚拟机垃圾回收调优的背景 ...

  6. Jenkins如何进行权限管理

    一.安装插件 插件名:Role-based Authorization Strategy 二.配置授权策略 三.创建用户 四.添加并配置权限 4.1.添加Global Role 普通角色拥有全局只读权 ...

  7. ASP.NET Core 包管理工具(4)

    之前忘记介绍ASP.NET Core静态文件wwwroot了.再来补充一下.步骤比较简单在项目上右击添加文件夹输入文件名称 wwwroot就搞定了.这个文件主要是放置一些静态文件的,比如css.js. ...

  8. Coursera课程笔记----计算导论与C语言基础----Week 12

    期末编程测试(Week 12) Quiz1 判断闰年 #include <iostream> using namespace std; int main() { int year; cin ...

  9. Java三大特征:封装 继承 多态

    内部类:成员内部类.静态内部类.方法内部类.匿名内部类. 内部类:定义在另外一个类里面的类,与之对应,包含内部类的外部类被称为外部类. 内部类的作用:(1)内部类提供了更好的封装,可以把内部类隐藏在外 ...

  10. HMM-前向后向算法(附python实现)

    基本要素 状态 \(N\)个 状态序列 \(S = s_1,s_2,...\) 观测序列 \(O=O_1,O_2,...\) \(\lambda(A,B,\pi)\) 状态转移概率 \(A = \{a ...