【c/c++详解红黑树构建】实现插入构建红黑树,遍历输出颜色(含源码)

【c/c++详解红黑树构建】实现插入构建红黑树,遍历输出颜色(含源码)

一、目的

1.熟悉算法设计的基本思想
2.掌握构建红黑树的方法

二、内容与设计思想

  1. 编写红黑树构建算法,中序遍历各节点,输出颜色和值;
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  2. 使用红黑树构建算法,并画图描述不同情况下的运行时间差异;

三、设计思想

考虑需要的函数与结构体

  • 需要通过输入插入建树,其中需要结点结构实现二叉搜索树遍历查找插入后的分情况处理结点旋转
  • 输出时需要一个中序遍历函数

细节实现

  • 已知红黑树的的特点,建树的时候要注意每次插入新节点都要保持其五个特性。

一棵红黑树是满足下面红黑性质的二叉搜索树:

  1. 各个结点或者是红色,或者是黑色的.
  2. 根结点是黑色的.
  3. 每个叶结点 (NIL) 是黑色的.
  4. 如果一个结点是红色,则它的两个子结点都是黑色的.
  5. 对于每个结点,从该结点到其所有后代叶结点的简单路径上,均包含相同数目的黑色结点.
    • 建树由插入新结点开始,即需寻找插入结点的规律使五个特性受到最小程度的破坏 。类似二叉搜索树找到新结点应存在的位置,再将其颜色设为红色’R’(若其颜色设为黑色,每次插入均会违反性质4;而插入颜色为红时,有可能不违反。
    • 插入新结点后存在的情况:
    1. 父结点为黑色,则未违反红黑树性质,不需调整。

    2. 父结点为红色:其中需调整只会影响到向上三层,也可理解为三层三层调整。其中祖结点为黑色,父结点与当前结点为红色,则不同情况共分为 当前结点为左或右叔结点为红或黑父结点为左或右分别叠加为8种
      其中当叔结点为红色时,只需重新设置颜色上移,此时当前结点为左或右无区别。
      其中 当其他状况相同,只有父结点在左或右的区别时为对称状态,只需将左右对换。
      因此,只需考虑3种情况: 设当前结点为z,当前结点的叔结点为y。

      1. z的父结点为左结点,叔结点y为红色,将不符的性质上移调整。

      z.p.color=B;
      y.color=B;
      z.p.p.color=R;
      z=z.p.p;
      在这里插入图片描述
      请添加图片描述

      2. z的父结点是左结点,叔结点y为黑色,z为左孩子。进行调整:

      z.p.color=B;
      z.p.p.color=R;
      Right_Rotate(z.p.p);请添加图片描述

      3. z的父结点为左结点,叔结点为黑色,z为右孩子。只需将其调整为情况二,再按照情况二的调整方式调整。

      z=z.p;
      LEFT-Rotate(z);请添加图片描述

【当z的父结点为右结点时,由于对称,将上述的所有right改为left,所有left改为right】

  • 根据了解红黑树,可写出红黑树结点的结构
    typedef struct Tree
    {
         
    	int data;
    	char color;
    	Tree*p;
    	Tree*left;
    	Tree*right;
    }
    
  • 以x为支点左旋 与 以y为支点右旋
    请添加图片描述
    均为分四步:结点之间拆分与连接 (右旋类似)请添加图片描述

四、实验过程

1.写出红黑树构建算法的源代码

#include <iostream>
using namespace std;

typedef struct Tree 		//红黑树结构
{
   
    int data;
    char color;
    Tree *left;
    Tree *right;
    Tree *parent;
} * Node;

Node root = nullptr; 	//记录根中内容


void Left_rotate(Node x)            //以x为支点左旋
{
   
    
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值