我先在CSDN上面发表了同样的文章,见https://blog.csdn.net/weixin_44385565/article/details/88863693 排版比博客园要好一些。。

1135 Is It A Red-Black Tree (30 分)

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:


 -   - -   -

 -  -  -   -

 -  -   - 

Sample Output:

Yes
No
No

题目大意:给出K个树,判断是否为红黑树;

红黑树是每个节点都带有颜色属性的二叉查找树,颜色为红色或黑色。在二叉查找树强制一般要求以外,对于任何有效的红黑树又有如下的额外要求:(定义来源:红黑树的维基百科

1、节点是红色或黑色。
2、根是黑色。
3、所有叶子都是黑色(叶子是NIL节点)。
4、每个红色节点必须有两个黑色的子节点。(从每个叶子到根的所有路径上不能有两个连续的红色节点。)
5、从任一节点到其每个叶子的所有简单路径都包含相同数目的黑色节点

思路:第4点只需要一次DFS判断就可以解决。第5点的要求,对于每个节点,先获取它的左右子树黑色节点的高度,再进行判断;这里全是递归,真的很绕脑~~

 #include<iostream>
#include<queue>
#include<cmath>
using namespace std;
typedef struct node* BT;
struct node{
int data=;
BT LChild=NULL,RChild=NULL;
}; BT BuildBST(BT t,int num);//建立二叉搜索树
bool NodeColor(BT t);//判断节点的颜色是否符合要求
int getNum(BT t);//获取当前节点的左右子树的高度(仅为黑色节点的高度)
bool isRBT(BT t);//判断是否为红黑树
bool BlackNode(BT t);//判断黑色节点的数量是否符合要求 int main()
{
int K;
scanf("%d",&K);
for(int i=;i<K;i++){
int N;
BT tree=NULL;
scanf("%d",&N);
for(int i=;i<N;i++){
int tmp;
scanf("%d",&tmp);
tree=BuildBST(tree,tmp);
}
if(isRBT(tree))
printf("Yes\n");
else
printf("No\n");
}
return ;
} bool BlackNode(BT t)
{
if(t==NULL) return true;
int Lnum=getNum(t->LChild);
int Rnum=getNum(t->RChild);
if(Lnum!=Rnum) return false;
return BlackNode(t->LChild)&&BlackNode(t->RChild);
} bool isRBT(BT t)
{
return BlackNode(t)&&NodeColor(t)&&t->data>;
} int getNum(BT t)
{
if(t==NULL)
return ;
int Lnum=getNum(t->LChild);
int Rnum=getNum(t->RChild);
return (t->data>)?max(Lnum,Rnum)+:max(Lnum,Rnum);
} bool NodeColor(BT t)
{
if(t==NULL) return true;
if(t->data<){
if((t->LChild!=NULL&&t->LChild->data<)||(t->RChild!=NULL&&t->RChild->data<)){
return false;
}
}
return NodeColor(t->LChild)&&NodeColor(t->RChild);
} BT BuildBST(BT t,int num)
{
if(t==NULL){
t=new node();
t->data=num;
}
else{
if(abs(num)<abs(t->data))
t->LChild=BuildBST(t->LChild,num);
else
t->RChild=BuildBST(t->RChild,num);
}
return t;
}

最新文章

  1. IDA的脚本IDC的一个简单使用
  2. bzoj 1030 fail树dp
  3. ReentRantLock使用
  4. Backpack | &amp; ||
  5. 怎么批量修改Word表格的宽度
  6. Android图形合成和显示系统---基于高通MSM8k MDP4平台
  7. Mysql 关键字-保留字(转帖)
  8. swift:打造你自己的折线图
  9. Step one : 熟悉Unix/Linux Shell 常见命令行 (一)
  10. HDU1392(凸包)
  11. Glide 这样用,更省内存!!!
  12. HDU [P1150] Machine Schedule
  13. PAT1116. Come on! Let's C (map)
  14. wordpress | WP Mail SMTP使用QQ邮箱发布失败的解决办法
  15. Mycat实现Mysql主从读写分离
  16. Appium 常用方法总结 (python 版)
  17. ef学习一
  18. 修改Unity中Lua文件的默认打开程序
  19. 【刷题】BZOJ 2095 [Poi2010]Bridges
  20. PHP系统编程--02.PHP守护进程化

热门文章

  1. socket基本使用
  2. Composite Pattern
  3. 网页中的title中设置图标
  4. loj#2340. 「WC2018」州区划分
  5. 树莓派保持网络连接shell脚本
  6. hadoop运行测试命令遇到的问题
  7. Mongodb 官网驱动2.2.4.26版本 增,删 改,查,mongodb2.2.4.26
  8. v-for指令用法一
  9. Js常见的六种报错
  10. C++ 两款静态检查工具