【数据结构】BRT红黑树

本文深入解析红黑树的数据结构,介绍了其概念、发展历程、插入和删除操作的规则,包括颜色标记、旋转调整和平衡保持。重点讲解了节点定义、插入过程中的黑叔和红叔操作,以及删除时的特殊情况。

[数据结构]红黑树

1.概念

发展历程

  • 线性查找-性能低
  • 二分查找-可能退化成链表
  • AVL-变化频繁,需要经常更新
  • 引入红黑树结构

定义

引入带颜色的节点也是为了方便在进行插入或删除操作时,如果破坏了二叉查找树的平衡性能通过一系列变换保持平衡。

红黑树的查找、插入、删除的时间复杂度均为O(log2n)

(注意:AVL的查找、插入、删除的时间复杂度均为O(log2n)

性质

  • 结点是红色或黑色;

  • 根结点是黑色。

  • 叶子结点(也叫外部结点、NULL结点、失败结点)是黑色。

  • 不存在两个相邻的红结点。(即红结点的父结点和子结点都是黑色的)

  • 从任意结点到可达的叶子结点的每个路径包含相同数目的黑色节点。

结论

  • 从根到叶节点的最长路径不大于最短路径的2倍。

  • 有n个内部节点的红黑树的高度h ≤ log2(n+1)。

节点定义的代码

// 红黑树的结点定义
struct RBnode{
    int key;    // 关键字的值
    RBnode *parent;   // 父节点的指针
    RBnode *lChild;   // 左孩子的指针
    RBnoce *rChild;   // 右孩子的指针
    int color;  // 结点颜色,如可用 0/1 表示 黑/红。也可用枚举型 enum 表示颜色。
}

2.红黑树的插入

先查找,确定插入位置(同二叉排序树),插入新结点

  • 新结点为——染为黑色
  • 新结点非根——染为红色
    • 若插入新结点后依然满足红黑树定义,则插入结束
    • 若插入新结点后不满足红黑树定义,需要调整,使其重新满足红黑树定义
      • 黑叔:旋转加染色
        • LL型:右单旋,父换爷+染色
        • RR型:左单旋,父换爷+染色
        • LR型:左、右双旋,儿换爷+染色
        • RL型:右、左双旋,儿换爷+染色
      • 红叔:染色+变新
        • 父叔爷染色,爷变为新结点

红黑树插入动画演示:http://rbtree.phpisfuture.com/

3.红黑树的删除

红黑树的插入操作容易导致连续的两个红结点,破坏性质4,而删除操作容易造成子树黑高的变化(删除黑节点),破坏性质5。

删除一个节点的两种情况:

  • 待删除节点没有孩子
  • 待删除节点只有右子树或左子树

详细情况讨论参考:

王道考研2023 280页

https://segmentfault.com/a/1190000022278733

虽然给定引用中未直接提及Python实现增强回归树(BRT)的代码示例和使用指南,但可结合相关知识给出示例。增强回归树是一种集成学习方法,通常使用AdaBoost等算法,下面是一个使用`scikit-learn`库实现增强回归树的简单示例代码: ```python from sklearn.datasets import make_regression from sklearn.ensemble import AdaBoostRegressor from sklearn.tree import DecisionTreeRegressor from sklearn.model_selection import train_test_split from sklearn.metrics import mean_squared_error # 生成示例数据 X, y = make_regression(n_samples=1000, n_features=10, noise=0.1, random_state=42) # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 创建基础回归器,这里使用决策树回归器 base_regressor = DecisionTreeRegressor(max_depth=1) # 创建AdaBoost回归器 brt = AdaBoostRegressor(base_estimator=base_regressor, n_estimators=50, random_state=42) # 训练模型 brt.fit(X_train, y_train) # 进行预测 y_pred = brt.predict(X_test) # 计算均方误差 mse = mean_squared_error(y_test, y_pred) print(f"Mean Squared Error: {mse}") ``` 在上述代码中,首先使用`make_regression`函数生成示例回归数据,然后将数据划分为训练集和测试集。接着创建一个基础的决策树回归器作为弱学习器,再使用`AdaBoostRegressor`创建增强回归树模型。之后对模型进行训练,并使用测试集进行预测,最后计算预测结果的均方误差。 使用指南方面: - 数据准备:确保数据的特征和目标变量正确分离,并且数据格式适合模型输入。 - 选择基础学习器:可根据具体情况选择不同的基础学习器,如决策树、线性回归等。 - 调整超参数:`n_estimators`控制弱学习器的数量,`learning_rate`控制每个弱学习器的权重更新步长等,可通过网格搜索等方法进行超参数优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值