⭐⭐⭐⭐⭐【红黑树】PAT A1135 Is It A Red-Black Tree
文章目录
- 题目描述
- 知识点
- 实现
- 码前思考
- 代码实现
- 码后思考
题目描述
知识点
BST
实现
码前思考
- 这5个性质里,第3个和第5个我一时没看懂,还是wiki了一下才明白的。红黑树的定义里,叶子节点是NULL节点,而不是通常所说的左右孩子为空的节点是NULL节点,也就是说每个左右孩子为空的节点,实际上左右孩子都是叶子节点。然后,性质5是说每个节点到达叶子节点(NULL)节点的简单路径上经过的黑色节点总数相等。
- 此外,我居然不知道
descendant
是 后辈 的意思,我这英语水平。。。 - 扫清了上面的疑问,就很好解题了:
判断以下几点:- 根结点是否为黑色
- 如果一个结点是红色,它的孩子节点是否都为黑色
- 从任意结点到叶子结点的路径中,黑色结点的个数是否相同
代码实现
#include "bits/stdc++.h"
using namespace std;
const int maxn = 40;struct node{int val;node* l;node* r;node(int v):val(v),l(NULL),r(NULL){}
};int k;
int n;
int pre[maxn];
bool flag; //使用前序加中序进行建树
//node* create(int preL,int preR){// if(preL > preR){// return NULL;
// }else{// //寻找左右子树
// node* root = new node(pre[preL]);
// int numLeft=0;
// for(int i=preL+1;i<=preR;i++){// if(abs(pre[preL]) >= abs(pre[i])){// numLeft++;
// }else{// break;
// }
// }
//
// //得到numLeft之后就可以划分左右子树了
// root->l = create(preL+1,preL+numLeft);
// root->r = create(preL+numLeft+1,preR);
//
// //注意返回root
// return root;
// }
//} void insert(node* &root,int x){if(root == NULL){// printf("%d ",x);root = new node(x);}else{if(abs(root->val) >= abs(x)){insert(root->l,x);}else{insert(root->r,x);}}
}node* create(int n){node* root = NULL;for(int i=0;i<n;i++){insert(root,pre[i]);}return root;
}//递归函数的意思代表当前根结点到叶子结点的黑色结点数
int dfs(node* root){if(root == NULL){return 0;}else{//这个结点不是空结点,那么需要进行一些判断//首先,这个结点是红色节点吗
// printf("当前访问:%d\n",root->val); if(root->val < 0){//需要判断左右结点的值,注意判断的先后,先判空再判值!顺序反了会出错的! if((root->l==NULL||root->l->val>0) && (root->r==NULL||root->r->val>0)){}else{// printf("这里红:%d\n",root->val);flag = false;} } //接下来就是遍历它的左右孩子int num=0;int pl = dfs(root->l);int pr = dfs(root->r);if(pl != pr){// printf("这里不等:%d\n",root->val);flag = false;//随便返回哪一个都行,反正没用了 return pl; }else{//如果相等的话if(root->val > 0){return pl+1;}else{return pl;} } }
} int main(){scanf("%d",&k);for(int i=0;i<k;i++){scanf("%d",&n);for(int j=0;j<n;j++){scanf("%d",&pre[j]);}//通过先序遍历结果进行建树node* root = NULL;root = create(n);
// printf("%d\n",root->val);//下面通过二叉树的递归来进行判断是否是红黑树//首先判断root是否是黑色if(root->val < 0){printf("No\n");}else{//否则进行下一步的判断flag = true;dfs(root);if(flag == true){printf("Yes\n");}else{printf("No\n");} } }return 0;
}
码后思考
- 所谓树的题目,万变不离DFS,所以一定要掌握DFS一棵树!!!
- 另外,通过使用传统构建BST的函数读入二叉搜索树的先序序列就可以得到BST,我上面注释的代码复杂化了问题!!!
- 当我们的结点不多时,我们还是主张通过
insert()
建树,这样逻辑没有那么绕~
⭐⭐⭐⭐⭐【红黑树】PAT A1135 Is It A Red-Black Tree相关推荐
- 红黑树的删除_Python实现红黑树的删除操作
上一篇文章使用Python实现了红黑树的插入操作.参考:Python实现红黑树的插入操作本篇文章使用Python实现红黑树的删除操作.先将红黑树的5条特性列出来:1. 节点是红色或黑色.2. 根节点是 ...
- 高级数据结构与算法 | 红黑树(Red-Black Tree)
文章目录 红黑树 红黑树的概念 红黑树的性质 红黑树与AVL树 红黑树的实现 红黑树的节点 红黑树的插入 红黑树的查找 红黑树的验证 完整代码 红黑树 红黑树的概念 红黑树,是一种二叉搜索树,但在每个 ...
- 红黑树概念及其相关操作的实现
红黑树的概念 红黑树,是一种二叉搜索树,但它并不像AVL树一样,每个结点绑定一个平衡因子.但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black. 通过 对任何一条从根到叶子的路径上各个 ...
- 红黑树和平衡二叉树的区别_面试题精选红黑树(c/c++版本)
红黑树的使用场景非常广泛,比如nginx中用来管理timer.epoll中用红黑树管理事件块(文件描述符).Linux进程调度Completely Fair Scheduler用红黑树管理进程控制块. ...
- Python实现红黑树的删除操作
Python实现红黑树的删除操作 本专栏的上一篇文章使用Python实现了红黑树的插入操作.参考:https://blog.csdn.net/weixin_43790276/article/detai ...
- Python实现红黑树的插入操作
Python实现红黑树的插入操作 本专栏中的上一篇文章介绍了什么是红黑树,以及红黑树的旋转和变色. 参考:https://blog.csdn.net/weixin_43790276/article/d ...
- 算法导论 之 红黑树 - 添加[C语言]
作者:邹奇峰 邮箱:Qifeng.zou.job@hotmail.com 博客:http://blog.csdn.net/qifengzou 日期:2013.12.24 21:00 转载请注明来自&q ...
- 红黑树探险:从理论到实践,一站式掌握C++红黑树
红黑树揭秘:从理论到实践,一站式掌握C++红黑树 引言 为什么需要了解红黑树? 红黑树在现代C++编程中的应用场景 树与平衡二叉搜索树 树的基本概念: 二叉搜索树的定义与性质: 平衡二叉搜索树的特点与 ...
- 从二叉查找树到平衡树:avl, 2-3树,左倾红黑树(含实现代码),传统红黑树...
参考:自平衡二叉查找树 ,红黑树, 算法:理解红黑树 (英文pdf:红黑树) 目录 自平衡二叉树介绍 avl树 2-3树 LLRBT(Left-leaning red-black tree左倾红黑树 ...
- 红黑树及其插入、删除操作
在二叉搜索树中,基本操作如结点的插入.删除.查找的性能上界都得不到保证,原因在于二叉搜索树的构造依赖于其结点值的插入顺序,最坏情况下二叉搜索树会退化为单链表(如下图所示).因此我们需要对二叉搜索树做出 ...
最新文章
- C# 返回值为 listT
- torch.Tensor和torch.tensor的区别
- Windows 技术篇-桌面图标全部消失问题解决方法,windows资源管理器重启实例演示
- java队列转集合_Java集合 使用Queue
- “leave the world behind”十一快乐出行
- 利用python爬虫(案例8)--今天就是吃X我也要搞到有道
- 中心城镇问题(长链剖分优化树形dp)
- java中整数如何表示,在Java中如何在位级别上内部表示整数?
- dubbo负载均衡策略和集群容错策略
- spark调用python_在MRS集群中使用Python3.7运行PySpark程序,调用RDD的take函数报错处理...
- 解决 c3p0 和 MySQL 集成情况下,连接长时间闲置后重新使用时报错的问题
- 【es】es 的 Setting和Environment
- 我对这个页面做了什么?
- 实战中的Agile开发
- 拼多多服务端实习生笔试-滑动窗口2018/4/3
- sql常用优化小知识
- Traceroute/tracert原理和实践
- linux秘钥登录使用authorized_keys不生效
- 微信的用户已退出是什么意思_微信版本更新,朋友圈能评论表情包了?安卓用户已退出群聊...
- win7下登录中国银行网银,叫你四步搞定!