PAT甲级-1135 Is It A Red-Black Tree
2018-03-11 12:18
429 查看
主要是要理解红黑树的定义:
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.
翻译:
(1)红黑树的节点只能为红或者黑。
(2)根节点是黑。
(3)null为黑,表示叶子节点(没有child的节点为叶子节点)可以为红为黑。如果条件改为null节点为红,则叶子节点必须为黑。
(4)如果该节点为红,其child节点都为黑。
(5)每个节点到叶子节点的路径上的black节点数都相等。其实这跟从根节点到叶子节点的每条路径上的总black节点数都相等是一个意思,想一下就能理解。
所以这题,只需判断:
1. 根节点是否为黑。
2. 每个红节点的所有child是否都为黑。
3. 根节点到每个叶子节点的路径上的黑节点数是否都相等。
#include <bits/stdc++.h>
using namespace std;
typedef struct node {
int key;
struct node *left;
struct node *right;
} Node, *Tree;
int T, N;
Node* tree_create(int key) {
// Node *p = (Node *)malloc(sizeof(Node));
Node *p = new Node();
p->key = key;
p->left = NULL;
p->right = NULL;
return p;
}
Node* tree_insert(Node *tree, int key) {
if(tree == NULL) {
tree = tree_create(key);
}
else if(abs(key) < abs(tree->key)) {
tree->left = tree_insert(tree->left, key);
}
else if(abs(key) > abs(tree->key)) {
tree->right = tree_insert(tree->right, key);
}
return tree;
}
int flag, reals;
bool red_jg(Node *tree, int cnt) {
if(tree == NULL) {
if(reals == -1) {
reals = cnt;
}
else if(reals != cnt){
flag = 0;
}
return true;
}
if(tree->key < 0) {
if(tree->left && tree->left->key < 0) {
return false;
}
if(tree->right && tree->right->key < 0) {
return false;
}
}
int tmp = tree->key > 0 ? 1 : 0;
if(!red_jg(tree->left, cnt+tmp)) {
return false;
}
if(!red_jg(tree->right, cnt+tmp)) {
return false;
}
return true;
}
int judge(Node *tree) {
if(tree->key < 0) {
return 0;
}
if(!red_jg(tree, 0)) {
return 0;
}
return flag;
}
void Free(Node *tree) {
if(tree->left) {
Free(tree->left);
}
if(tr
4000
ee->right) {
Free(tree->right);
}
delete tree;
// free(tree);
tree = NULL;
}
int main() {
scanf("%d", &T);
for(int _ = 1; _ <= T; ++_) {
scanf("%d", &N);
flag = 1, reals = -1;
Tree root = NULL;
for(int i = 1; i <= N; ++i) {
int key;
scanf("%d", &key);
root = tree_insert(root, key);
}
if(judge(root)) {
printf("Yes\n");
}
else {
printf("No\n");
}
Free(root);
}
return 0;
}
另外补充c的free和c++的delete的区别:
delete 用于释放new分配的内存,和new成对调用
free 用于释放malloc分配的内存,和malloc成对调用
使用free释放时需要判断指针是否为NULL,delete不用
free 释放内存,但不调用对象的析构函数
delete 不仅释放内存,还调用对象的析构函数
delete 和new是对对象的操作,是运算符
free 和malloc是对内存空间的操作
继续加油~
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.
翻译:
(1)红黑树的节点只能为红或者黑。
(2)根节点是黑。
(3)null为黑,表示叶子节点(没有child的节点为叶子节点)可以为红为黑。如果条件改为null节点为红,则叶子节点必须为黑。
(4)如果该节点为红,其child节点都为黑。
(5)每个节点到叶子节点的路径上的black节点数都相等。其实这跟从根节点到叶子节点的每条路径上的总black节点数都相等是一个意思,想一下就能理解。
所以这题,只需判断:
1. 根节点是否为黑。
2. 每个红节点的所有child是否都为黑。
3. 根节点到每个叶子节点的路径上的黑节点数是否都相等。
#include <bits/stdc++.h>
using namespace std;
typedef struct node {
int key;
struct node *left;
struct node *right;
} Node, *Tree;
int T, N;
Node* tree_create(int key) {
// Node *p = (Node *)malloc(sizeof(Node));
Node *p = new Node();
p->key = key;
p->left = NULL;
p->right = NULL;
return p;
}
Node* tree_insert(Node *tree, int key) {
if(tree == NULL) {
tree = tree_create(key);
}
else if(abs(key) < abs(tree->key)) {
tree->left = tree_insert(tree->left, key);
}
else if(abs(key) > abs(tree->key)) {
tree->right = tree_insert(tree->right, key);
}
return tree;
}
int flag, reals;
bool red_jg(Node *tree, int cnt) {
if(tree == NULL) {
if(reals == -1) {
reals = cnt;
}
else if(reals != cnt){
flag = 0;
}
return true;
}
if(tree->key < 0) {
if(tree->left && tree->left->key < 0) {
return false;
}
if(tree->right && tree->right->key < 0) {
return false;
}
}
int tmp = tree->key > 0 ? 1 : 0;
if(!red_jg(tree->left, cnt+tmp)) {
return false;
}
if(!red_jg(tree->right, cnt+tmp)) {
return false;
}
return true;
}
int judge(Node *tree) {
if(tree->key < 0) {
return 0;
}
if(!red_jg(tree, 0)) {
return 0;
}
return flag;
}
void Free(Node *tree) {
if(tree->left) {
Free(tree->left);
}
if(tr
4000
ee->right) {
Free(tree->right);
}
delete tree;
// free(tree);
tree = NULL;
}
int main() {
scanf("%d", &T);
for(int _ = 1; _ <= T; ++_) {
scanf("%d", &N);
flag = 1, reals = -1;
Tree root = NULL;
for(int i = 1; i <= N; ++i) {
int key;
scanf("%d", &key);
root = tree_insert(root, key);
}
if(judge(root)) {
printf("Yes\n");
}
else {
printf("No\n");
}
Free(root);
}
return 0;
}
另外补充c的free和c++的delete的区别:
delete 用于释放new分配的内存,和new成对调用
free 用于释放malloc分配的内存,和malloc成对调用
使用free释放时需要判断指针是否为NULL,delete不用
free 释放内存,但不调用对象的析构函数
delete 不仅释放内存,还调用对象的析构函数
delete 和new是对对象的操作,是运算符
free 和malloc是对内存空间的操作
继续加油~
相关文章推荐
- PAT 甲级 1135 Is It A Red-Black Tree
- 1135. Is It A Red-Black Tree (30)-PAT甲级真题
- PAT甲级 1135.Is It A Red-Black Tree (30)
- PAT甲级 1135. Is It A Red-Black Tree (30) 建树+深搜
- PAT甲级 1135 - Is It A Red-Black Tree
- PAT甲级1135 Is It A Red-Black Tree
- PAT (Advanced Level)1135. Is It A Red-Black Tree (30) 指针 建树 深度优先遍历
- 【PAT 1135. Is It A Red-Black Tree (30)】& 二叉树
- pat1135 Is It A Red-Black Tree (30)(红黑树)
- PAT (Advanced Level) Practise 1135 Is It A Red-Black Tree (30)
- (pat)A1135. Is It A Red-Black Tree
- PAT 1135. Is It A Red-Black Tree (30) 二叉搜索树建立 + 红黑树判断
- PAT-1135 Is It A Red-Black Tree(二叉查找树的创建和遍历)
- 1135. Is It A Red-Black Tree (30)/红黑树 搜索建树
- 1135. Is It A Red-Black Tree (30)
- 1135. Is It A Red-Black Tree (30)[红黑树判断]
- 1135. Is It A Red-Black Tree (30) 红黑树
- 1135. Is It A Red-Black Tree (30)(红黑树)
- 1135. Is It A Red-Black Tree (30)
- 1135. Is It A Red-Black Tree 解析