链接:1135. Is It A Red-Black Tree (30)

红黑树的性质:

  (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节点数都相等。第5点的原意是每个节点到叶子节点的路径上的black节点数都相等,跟根节点到叶子节点的意思一样,而且从根节点计算更方便。因为每个节点到叶子节点上的路径都是根节点到叶子节点路径的一部分。

  

  吐槽:这次PAT考试由于延考一个小时,又加上临时该题,题目出的真的不咋地,4道题目都是题意不清,全靠不断的猜和提交代码测试,才逐渐摸索出题意。虽然只考了91分,但是没接触过红黑树,做不出也可以原谅哈。

  理解了红黑树的性质,题目就变得简单,第一步根据先序遍历构造数,由于红黑树是BST树(BST的性质:左孩子比父节点小,右孩子比父节点大),所以已知一个先序就可以很快的构造了。第二步使用dfs来判断是否红黑树就行了。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std; int n,a[]; struct Node
{
int val;
int bBlack;
int lBlackNum;
int rBlackNum;
int tBlackNum;
Node* left;
Node* right;
Node()
{
left = right = ;
lBlackNum = rBlackNum = tBlackNum = ;
}
void setVal(int iVal)
{
if(iVal > ) bBlack = ;
else if(iVal < )bBlack = ;
val = abs(iVal);
}
}; Node* CreateTree(int l,int r)
{
if(l > r) return NULL;
Node* nd = new Node();
nd -> setVal(a[l]);
int i = l+;
for(;i<=r;++i)
if(abs(a[i]) > abs(a[l])) break;
nd -> left = CreateTree(l+,i-);
nd -> right = CreateTree(i,r);
return nd;
} void DelTree(Node **nd)
{
if(*nd == NULL) return;
DelTree(&(*nd)->left);
DelTree(&(*nd)->right);
delete *nd;
*nd = ;
}
bool bIsTree = true; int lastnum = -;
void dfs(Node* nd,int cnt)
{
if(!bIsTree) return;
if(nd == NULL)
{
if(lastnum == -) lastnum = cnt;
else if(lastnum != cnt){bIsTree = false;}
return;
}
if(nd->bBlack) ++cnt;
else
{
if(nd->left&&!nd->left->bBlack) bIsTree = false;
if(nd->right&&!nd->right->bBlack) bIsTree = false;
}
dfs(nd->left,cnt);
dfs(nd->right,cnt); } int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i=;i<n;++i)
scanf("%d",&a[i]);
Node* root = CreateTree(,n-);
bIsTree = root->bBlack;
lastnum = -; //初始化会忘
dfs(root,);
if(bIsTree) printf("Yes\n");
else printf("No\n");
DelTree(&root); //清理内存也很重要,因为很多公司会看代码,这一行代码有加分。
}
return ;
}

以下是一种更加简便的创建红黑树的方法,判断过程不变。该方法由同样热爱编程的网友提供。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std; struct Node
{
int val;
int bBlack;
Node* left;
Node* right;
Node()
{
left = right = 0;
}
void setVal(int iVal)
{
if(iVal > 0) bBlack = 1;
else if(iVal < 0)bBlack = 0;
val = abs(iVal);
}
}; Node* Insert(Node *root,int val)
{
if(NULL == root){
root = new Node();
root->setVal(val);
return root;
}
if(abs(val) < root->val){
root->left = Insert(root->left,val);
}else
root->right = Insert(root->right,val);
return root;
} void DelTree(Node **nd)
{
if(*nd == NULL) return;
DelTree(&(*nd)->left);
DelTree(&(*nd)->right);
delete *nd;
*nd = 0;
}
bool bIsTree = true; int lastnum = -1;
void dfs(Node* nd,int cnt)
{
if(!bIsTree) return;
if(nd == NULL)
{
if(lastnum == -1) lastnum = cnt;
else if(lastnum != cnt){bIsTree = false;}
return;
}
if(nd->bBlack) ++cnt;
else
{
if(nd->left&&!nd->left->bBlack) bIsTree = false;
if(nd->right&&!nd->right->bBlack) bIsTree = false;
}
dfs(nd->left,cnt);
dfs(nd->right,cnt); }
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int a,n;
scanf("%d",&n);
Node* root = NULL;
for(int i=0;i<n;++i)
{
scanf("%d",&a);
root = Insert(root,a);
}
bIsTree = root->bBlack;
lastnum = -1; //初始化会忘
dfs(root,0);
if(bIsTree) printf("Yes\n");
else printf("No\n");
DelTree(&root); //清理内存也很重要,因为很多公司会看代码,这一行代码有加分。
}
return 0;
}

  

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

  1. 【PAT甲级】1099 Build A Binary Search Tree (30 分)

    题意: 输入一个正整数N(<=100),接着输入N行每行包括0~N-1结点的左右子结点,接着输入一行N个数表示数的结点值.输出这颗二叉排序树的层次遍历. AAAAAccepted code: # ...

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

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

  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

    https://pintia.cn/problem-sets/994805342720868352/problems/994805346063728640 There is a kind of bal ...

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

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

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

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

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

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

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

随机推荐

  1. java读取大文本文件

    原文:http://blog.csdn.net/k21325/article/details/53886160 小文件当然可以直接读取所有,然后放到内存中,但是当文件很大的时候,这个方法就行不通了,内 ...

  2. 根据身份证号,取得行政区划的Javascript实现

    原文:http://www.cnblogs.com/baibaluo/archive/2011/06/03/2071255.html#2585076 项目里需要一个根据身份证号,取得发证地行政区划的的 ...

  3. dubbo安装和使用

    转载:http://blog.csdn.net/zjcjava/article/details/78766095 背景 Dubbo的开源人梁飞在内部的交流会上宣布重启dubbo的维护和更新,具体PPT ...

  4. poj 2318 TOYS &amp; poj 2398 Toy Storage (叉积)

    链接:poj 2318 题意:有一个矩形盒子,盒子里有一些木块线段.而且这些线段坐标是依照顺序给出的. 有n条线段,把盒子分层了n+1个区域,然后有m个玩具.这m个玩具的坐标是已知的,问最后每一个区域 ...

  5. maven 手动构建项目

    maven 手动构建项目 在空目录下面: D:\test>mvn -B archetype:generate -DarchetypeGroupId=org.apache.maven.archet ...

  6. 使用shell分页读取600万+的MySQL数据脚本

    shell-mysql 脚本背景 因为要在Linux上.远程读取mysql的表的数据,然后做一定清洗后.把数据上传至Hadoop集群中,使用Java写吧,感觉太麻烦了.得在Win上开发好,还得打成ja ...

  7. org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not

    遇到这个问题之前,我去百度和谷歌去搜索了一下.发现各种说法.可是针对我的项目而言,也就是公司的项目而言,这个问题的根源并不是是网上所说的那样. 最后是通过自己的想法做測试得到了解决. 1.首先说说我的 ...

  8. Android WebView开发常见问题

    1.加入权限:AndroidManifest.xml中必须使用许可"android.permission.INTERNET",否则会出Web page not available错 ...

  9. uva10655

    Given the value of a+b and ab you will have to find the value of a n + b n Input The input file cont ...

  10. Java 中extends与implements使用方法 (转载)

    转自:http://blog.csdn.net/chen_chun_guang/article/details/6323201 初学Java语言, 代码中的extends和implements让我感到 ...