T tree c++实现源代码(一)
来源:互联网 发布:天猫淘宝商城 编辑:程序博客网 时间:2024/05/29 10:22
这是关于 T tree 这种数据结构的源代码。
偶然间看到 T tree 这种数据结构,就想自己实现一下,上网搜了搜,关于 这方面的资料并不多。
我也没找到精确的关于 T tree 的定义(或许找到了,但我不确定)。
我参考一些网上的定义,总结如下:
T tree 是一种二叉树;
有左子节点和右子节点的节点称为内部节点;
只有一个子节点的节点称为半叶节点;
没有子节点的节点称为叶节点;
节点中数据的个数小于一个最大值;
内部节点中数据的个数大于等于一个临界值,临界值小于等于最大值;
左子树与右子树的高度差不超过2;
差不多就这些了。
我的思路是这样的:
首先是四种旋转操作,熟悉 avl tree 的话,对这四种旋转操作应该不会陌生吧。
在旋转的过程中,可能会把半叶节点或是叶节点转化为内部节点,如果节点中元素的个数少于临界值,
就需要调整了(在插入操作过程中也会出现 把半叶节点或是叶节点转化为内部节点 的情况,但其中的元素个数不会少于临界值)。
调整的时候:
会先向自己的子节点或父节点借数据,借完之后,如果子节点或是 父节点为空,就将其合并,
合并后,只需调整平衡因子就行了,不必再旋转了;
如果子节点 或是父节点不为空,正常进行旋转操作就可以了。
插入操作:
如果待插入的数据小于该节点中的最小值,尝试在左子树中插入,
如果左子树的为空,且该节点不满,就把带插入数据放在这个节点里面作为最小值,
如果节点满了,就申请一个新的节点作为左子树,并把待插入的数据放到左子树里。
如果待插入的数据落在该节点最小值和最大值之间,就把待插入的数据放到节点里面,
如果该节点溢出了,就把该节点的最小值拿出来作为新的带插入的数据,在左子树里面继续插入;
大于节点最大值的情况与小于最小值的类似,就不赘述了,
期间如果子树不平衡,就需要旋转操作了;
删除操作:
如果待删除的数据小于该节点的最大值,尝试在左子树删除,
如果待删除的数据就在该节点里面,删除该数据,
如果给节点为空,删除节点,
如果是内部节点,且元素个数少于临界值,就在左子树里面寻找最大值,代替删除的元素;
在右子树删除的情况与左子树类似。
t_node 文件:
#ifndef T_NODE_H
#define T_NODE_H
#include <iostream>
#include <stack>
using namespace std;
//下面是 T 树 节点 的定义
//节点存储的数据 或是 索引 的 最大数目;
#define MAX_NUM 256
class t_node
{
public:
//当前节点中存储的 数据或是索引的数目;
int data_num;
//存储数据 或是 索引 的 数组;
int data[MAX_NUM];
//平衡因子 , 只能取值为 0,-1,1;
//右子树的高度-左子树的高度;
int bf;
//左右子树的指针;
t_node * pleft;
t_node * pright;
//构造函数;
t_node():data_num(0),bf(0),pleft(NULL),pright(NULL){}
//得到该节点中 数据 中的最大值;
inline int get_max()
{
return data[data_num-1];
}
//得到该节点中 数据 的 最小值;
inline int get_min()
{
return data[0];
}
//判断该节点是否 是 叶节点;
inline bool is_leaf()
{
return NULL==pleft && NULL==pright;
}
//判断该节点 是否 是 半叶节点;
inline bool is_half_leaf()
{
if(is_leaf())
return false;
return NULL==pleft ||NULL==pright;
}
};
#endif//ifndef T_NODE_H;
- T tree c++实现源代码(一)
- T tree c++实现源代码(二)
- T-tree C++实现源代码
- T-tree原理与实现
- T-tree原理与实现
- tree工具实现的源代码
- 实现自绘 ComboBox 源代码 (C#)
- 消灭星星源代码(c语言实现)
- GTK实现:扫雷源代码(saolei.c)
- lcc源代码解析之tree.c
- B_TREE B+TREE(C 实现)
- MD5算法的T-SQL实现(FOR SQL2000)(一)
- MD5算法的T-SQL实现(FOR SQL2000)(一)
- MD5算法的T-SQL实现(FORSQL2000)(一)
- T树索引的学习与实现(一)
- C库源代码实现: strtok
- c实现生产者消费者源代码
- RTree源代码-c语言实现
- The problem of UDP
- 日记月累
- qt中支持中文
- Android清空画布
- lucene可以做什么
- T tree c++实现源代码(一)
- 推荐几个Windows嵌入式系统的开源项目
- C#改变颜色的深浅(加深或变浅已知颜色)
- Android中用Toast.cancel()方法优化toast内容的显示
- T tree c++实现源代码(二)
- 模拟器与真机下ffmpeg for iOS的编译方法
- Java垃圾回收
- iPad和iPhone的app图标尺寸、用途、设置方法
- XP下Virtualbox虚拟Ubuntu共享文件夹设置