2-3-4 Tree
简介
2-3-4 Tree又叫2-4 Tree,属于一种平衡查找树,其高度满足:<=$\log_2 x N$,关于性能问题,以后会专门出个小专题来讨论。
– 以下出自[维基百科]
- 2-节点,就是说,他包含1个元素和2个子节点
- 3-节点,就是说,他包含2个元素和3个子节点
- 4-节点,就是说,他包含3个元素和4个子节点
从上面我们可以看出一个非叶子节点的子节点的个数总是比它的元素个数少一个。
2-4Tree是一棵查找树,因此它的元素的排列也是具有一定的顺序。具体可自行查阅。本文主要给出2-4Tree相关操作的主要算法。
为了行文方便,下面统一将2-3-4 Tree成为2-4 Tree。
操作算法分析
本文所用代码取自倪升武的博客,本人只是对其代码进行了一些注解和说明。在此对倪升武 表示感谢!
2-4Tree操作节点的定义代码
这里我们将节点内部的值包装进DataItem类,首先是DataItem类:
// 数据项
class DataItem
{
public long dData;
public DataItem(long data)
{
dData = data;
}
public void displayItem()
{
System.out.print("/" + dData);
}
}
然后是2-4Tree的节点定义类:
// 节点
class Node2
{
private static final int ORDER = 4;
private int numItems; // 表示该节点存有多少个数据项
private Node2 parent; //父节点
private Node2 childArray[] = new Node2[ORDER]; // 存储子节点的数组,最多4个子节点
private DataItem itemArray[] = new DataItem[ORDER - 1];// 该节点中存放数据项的数组,每个节点最多存放3个数据项
// 将child节点连接到节点的childNum的位置上
public void connectChild(int childNum, Node2 child)
{
childArray[childNum] = child;
if (child != null)
{
child.parent = this;
}
}
// 断开与子节点的连接,并返回该子节点
public Node2 disconnectChild(int childNum)
{
Node2 tempNode = childArray[childNum];
childArray[childNum] = null;
return tempNode;
}
//得到childNum位置上的子节点
public Node2 getChild(int childNum)
{
return childArray[childNum];
}
public Node2 getParent()
{
return parent;
}
//判断是否是叶子节点,依据:因为对于非叶子节点,总是满足子节点个数=父节点元素个数+1;在满足这种条件的情况下,子节点的排列总是从childArray[0]开始。
public boolean isLeaf()
{
return (childArray[0] == null);
}