IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 判断是否为红黑树 -> 正文阅读

[数据结构与算法]判断是否为红黑树

目录

红黑树条件????????

结点定义

判断方式

判断根的颜色是否为黑

判断红结点的子结点

判断任意结点到所有后代叶子是否包含相同数量的黑色结点

实现

经验总结

红黑树条件????????

  1. 根为黑
  2. 红结点的子结点黑
  3. 对于每个结点,从该结点到后代叶子的所有简单路径都包含相同数量的黑色结点

结点定义

typedef struct RBTnode
{
	int data;
	bool color; // 0 for black, 1 for red
	RBTnode *lchild, *rchild;
	int left, right, it;
} * RBTree, Node, *node;

判断方式

  1. 判断根的颜色是否为黑

  2. 判断红结点的子结点颜色

    1. 通过任意顺序遍历一次,如果是红色,就判断子结点是否为黑色

  3. 判断任意结点到所有后代叶子是否包含相同数量的黑色结点

    1. 结构:
      对于每一个结点,加入三个数据:
      1. left:从左子到叶有多少个黑结点
      2. right:从右子到叶有多少个黑结点
      3. it:自己到叶有多少个黑结点
    2. 例子:
      以该树为例

      ??

      对于结点4

      左右子树到叶均有一个黑(leftright1)

      自己为红(it等于leftright等于1)

      对于结点5

      左右子树到叶均有一个黑(leftright1)

      自己为黑(it等于leftright加一,等于2)

      对于结点1

      左右子树到叶均有一个黑(leftright1)

      自己为黑(it等于leftright加一,等于2)

      对于结点2

      左右子树到叶均有两个黑(leftright2)

      自己为红(it等于leftright等于2)

  4. ?规律
    1. 每一个结点如果有左子树,那么他的的left等于他lchildit,如果没有左子树,那么他的left等于1(NULL为黑)
      每一个结点如果有右子树,那么他的的right等于他rchildit,如果没有右子树,那么他的right等于1(NULL为黑)
    2. 如果一个结点的leftright相等
      ? ? ? ?每一个红结点的it等于他的leftright
      ? ? ? ?每一个黑节点的it等于他的(leftright)+1
      如果一个结点的leftright不相等
      ? ? ? ?说明不是红黑树
    3. 由1)和2)可以发现,在处理每一个结点的时候,需要先了解他的lchildrchild的情况,也就是处理顺序为->,按照什么顺序能刚好把一棵树按照子->父的顺序遍历一遍呢,刚好是后序(左右根)。

综上所述,只需要先判断根是否为黑,再后序遍历一遍,即可判断是否为红黑树

实现

void No()
{
    system("cls");
    printf("No\n");
    exit(0);
}

void judge(node x)
{
    if (x->color) //根为红
        No();
    post_order_t(x);
    system("cls");
    printf("Yes\n");
}

void post_order_t(node x)
{
    if (!x)
        return;
    post_order_t(x->lchild);//左
    post_order_t(x->rchild);//右

    //判断红色节点的子节点是否为黑
    if (x->color)
    {
        if (x->rchild)
            if (x->rchild->color)
                No();
        if (x->lchild)
            if (x->lchild->color)
                No();
    }

    //判断左右有几黑
    if (x->lchild)
        x->left = (x->lchild->it);
    else
        x->left = 1;
    if (x->rchild)
        x->right = (x->rchild->it);
    else
        x->right = 1;
    if (x->left == x->right)
        x->it += x->left;
    else
        No();
}

经验总结

首先要搞清楚,一共要判断哪些东西,比如,该题要先判断红结点的子结点颜色,可以用任意顺序遍历,但不用着急写实现。另一个在判断内容后,发现需要后序遍历,都研究好之后,可以用一次后序遍历处理掉所有问题。

其次是善于运用bool型变量,将10与实际需求联系起来,比如在判断红结点的子节点是否为黑时,更多需要的是判断某个结点是否为红

//判断红色节点的子节点是否为黑
if (x->color)
{
    if (x->rchild)
        if (x->rchild->color)
            No();
    if (x->lchild)
        if (x->lchild->color)
            No();
}

此时,1代表红,0代表黑就可以很好的利用起来

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-11-15 16:07:29  更:2021-11-15 16:08:28 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 10:26:20-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码