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;

 

原创粉丝点击