文章目录

  • 题目描述
  • 知识点
  • 实现
    • 码前思考
    • 代码实现
    • 码后思考

题目描述

知识点

BST

实现

码前思考

  1. 这5个性质里,第3个和第5个我一时没看懂,还是wiki了一下才明白的。红黑树的定义里,叶子节点是NULL节点,而不是通常所说的左右孩子为空的节点是NULL节点,也就是说每个左右孩子为空的节点,实际上左右孩子都是叶子节点。然后,性质5是说每个节点到达叶子节点(NULL)节点的简单路径上经过的黑色节点总数相等。
  2. 此外,我居然不知道descendant后辈 的意思,我这英语水平。。。
  3. 扫清了上面的疑问,就很好解题了:
    判断以下几点:

    1. 根结点是否为黑色
    2. 如果一个结点是红色,它的孩子节点是否都为黑色
    3. 从任意结点到叶子结点的路径中,黑色结点的个数是否相同

代码实现

#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;
}

码后思考

  1. 所谓树的题目,万变不离DFS,所以一定要掌握DFS一棵树!!!
  2. 另外,通过使用传统构建BST的函数读入二叉搜索树的先序序列就可以得到BST,我上面注释的代码复杂化了问题!!!
  3. 当我们的结点不多时,我们还是主张通过insert()建树,这样逻辑没有那么绕~

⭐⭐⭐⭐⭐【红黑树】PAT A1135 Is It A Red-Black Tree相关推荐

  1. 红黑树的删除_Python实现红黑树的删除操作

    上一篇文章使用Python实现了红黑树的插入操作.参考:Python实现红黑树的插入操作本篇文章使用Python实现红黑树的删除操作.先将红黑树的5条特性列出来:1. 节点是红色或黑色.2. 根节点是 ...

  2. 高级数据结构与算法 | 红黑树(Red-Black Tree)

    文章目录 红黑树 红黑树的概念 红黑树的性质 红黑树与AVL树 红黑树的实现 红黑树的节点 红黑树的插入 红黑树的查找 红黑树的验证 完整代码 红黑树 红黑树的概念 红黑树,是一种二叉搜索树,但在每个 ...

  3. 红黑树概念及其相关操作的实现

    红黑树的概念 红黑树,是一种二叉搜索树,但它并不像AVL树一样,每个结点绑定一个平衡因子.但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black. 通过 对任何一条从根到叶子的路径上各个 ...

  4. 红黑树和平衡二叉树的区别_面试题精选红黑树(c/c++版本)

    红黑树的使用场景非常广泛,比如nginx中用来管理timer.epoll中用红黑树管理事件块(文件描述符).Linux进程调度Completely Fair Scheduler用红黑树管理进程控制块. ...

  5. Python实现红黑树的删除操作

    Python实现红黑树的删除操作 本专栏的上一篇文章使用Python实现了红黑树的插入操作.参考:https://blog.csdn.net/weixin_43790276/article/detai ...

  6. Python实现红黑树的插入操作

    Python实现红黑树的插入操作 本专栏中的上一篇文章介绍了什么是红黑树,以及红黑树的旋转和变色. 参考:https://blog.csdn.net/weixin_43790276/article/d ...

  7. 算法导论 之 红黑树 - 添加[C语言]

    作者:邹奇峰 邮箱:Qifeng.zou.job@hotmail.com 博客:http://blog.csdn.net/qifengzou 日期:2013.12.24 21:00 转载请注明来自&q ...

  8. 红黑树探险:从理论到实践,一站式掌握C++红黑树

    红黑树揭秘:从理论到实践,一站式掌握C++红黑树 引言 为什么需要了解红黑树? 红黑树在现代C++编程中的应用场景 树与平衡二叉搜索树 树的基本概念: 二叉搜索树的定义与性质: 平衡二叉搜索树的特点与 ...

  9. 从二叉查找树到平衡树:avl, 2-3树,左倾红黑树(含实现代码),传统红黑树...

    参考:自平衡二叉查找树 ,红黑树, 算法:理解红黑树 (英文pdf:红黑树) 目录 自平衡二叉树介绍 avl树 2-3树 LLRBT(Left-leaning red-black tree左倾红黑树 ...

  10. 红黑树及其插入、删除操作

    在二叉搜索树中,基本操作如结点的插入.删除.查找的性能上界都得不到保证,原因在于二叉搜索树的构造依赖于其结点值的插入顺序,最坏情况下二叉搜索树会退化为单链表(如下图所示).因此我们需要对二叉搜索树做出 ...

最新文章

  1. C# 返回值为 listT
  2. torch.Tensor和torch.tensor的区别
  3. Windows 技术篇-桌面图标全部消失问题解决方法,windows资源管理器重启实例演示
  4. java队列转集合_Java集合 使用Queue
  5. “leave the world behind”十一快乐出行
  6. 利用python爬虫(案例8)--今天就是吃X我也要搞到有道
  7. 中心城镇问题(长链剖分优化树形dp)
  8. java中整数如何表示,在Java中如何在位级别上内部表示整数?
  9. dubbo负载均衡策略和集群容错策略
  10. spark调用python_在MRS集群中使用Python3.7运行PySpark程序,调用RDD的take函数报错处理...
  11. 解决 c3p0 和 MySQL 集成情况下,连接长时间闲置后重新使用时报错的问题
  12. 【es】es 的 Setting和Environment
  13. 我对这个页面做了什么?
  14. 实战中的Agile开发
  15. 拼多多服务端实习生笔试-滑动窗口2018/4/3
  16. sql常用优化小知识
  17. Traceroute/tracert原理和实践
  18. linux秘钥登录使用authorized_keys不生效
  19. 微信的用户已退出是什么意思_微信版本更新,朋友圈能评论表情包了?安卓用户已退出群聊...
  20. win7下登录中国银行网银,叫你四步搞定!

热门文章

  1. 【Android珍藏】推荐10个炫酷的开源库
  2. Java的国际化与本地化
  3. 爱情:两个人的一辈子
  4. 一个人的风水【幸福与烦恼】
  5. 基于比特级重要性编码的协同过滤算法
  6. 个人网站支付,个人 APP 支付,如何接入支付?
  7. ue4 纹理流送导致的光照贴图问题
  8. wlan服务器文件路径,用于无线局域网 (WLAN) 的 Netsh 命令
  9. 蘑菇街API 获取商品详情 Onebound全球电商数据接口
  10. C/C++编程学习 - 第13周 ③ 苹果和虫子2