1.实验内容
本次实验要求对红黑树进行修改,使其成为一颗区间树,并实现区间树上重叠区间的查找算法。具体任务是:
-
实现一个基于红黑树的区间树结构。
-
提供重叠区间查找功能,允许通过控制台输入待查询区间,并返回与之重叠的区间。
程序的输入是一个区间集合,来源于 insert.txt
文件。文件的第一行是区间个数,后续每行包含一个区间 [low, high]
。程序的输出是控制台打印查找结果,即与输入查询区间重叠的所有区间。
2.实验目的
-
学习并实现 区间树 数据结构。
-
理解红黑树如何扩展为区间树,并能处理区间数据。
-
实现并掌握 区间重叠查询 算法,提升算法优化能力。
-
掌握如何用树结构优化区间查询问题,尤其是如何利用节点的附加信息(如最大区间上界
max
)加速查询。
3.区间树的数据结构
区间树的每个节点包含以下信息:
-
区间的左端点和右端点。
-
节点的最大值,表示以该节点为根的子树中所有区间的右端点的最大值。
-
左子树和右子树的指针。
-
#define BLACK 0 // 黑色节点 #define RED 1 // 红色节点 // 区间结构体 typedef struct interval { int low; // 区间的下界 int high; // 区间的上界 } interval; // 区间树节点结构体 typedef struct IntervalTNode { int key; // 节点的关键字(即区间的下界) bool color; // 节点的颜色(红色或黑色) IntervalTNode *parent; // 父节点指针 IntervalTNode *left; // 左子节点指针 IntervalTNode *right; // 右子节点指针 interval inte; // 存储的区间信息 int max; // 存储子树的最大区间上界 } IntervalTNode; // 区间树结构体 typedef struct IntervalTree { IntervalTNode *root; // 区间树的根节点 } IntervalTree;
4.源码 + 注释
#include <iostream>
#include <iomanip>
#include <fstream>
#include <vector>
#include <functional>
using namespace std;
#define BLACK 0 // 黑色节点
#define RED 1 // 红色节点
// 区间结构体
typedef struct interval {
int low; // 区间的下界
int high; // 区间的上界
} interval;
// 区间树节点结构体
typedef