我真的很感激2-3-4树中的澄清...假设你有一个像这样定义的树:
class N234{ //node class
public:
int firstData, secondData, thirdData;
N234 *firstChild,*secondChild,*thirdChild,*fourthChild,*parent;
};
class T234{ //tree with root node
public:
T234(){
this->root->parent=NULL;
this->root->firstChild=NULL;
this->root->secondChild=NULL;
this->root->thirdChild=NULL;
this->root->fourthChild=NULL;
}
private:
N234* root;
};
我的问题实际上是当我的变量(firstData,secondData,thirdData)已经有一些值时,我怎么知道节点是否已满(其中包含所有三个值)?
例如:
root:| 4 | root的左子:| 1,2 |
右孩子的根| 7,9 |
这里root有一个值(4)。我的问题是我们怎么知道它实际上有一个值,因为他的所有其他变量(secondData,thirdData)都有一些值(即使它是垃圾)...提前谢谢!
答案 0 :(得分:0)
如果我们只担心内部节点,最简单的方法是查看子指针:
如果thirdChild
为null,则该节点为2节点,因此它只有一个有意义的值(firstData
),其余的(secondData
,{{1} })包含垃圾。
如果thirdData
不为空,但thirdChild
为空,那么它是一个3节点;前两个数据变量包含有意义的值。
如果所有子指针都是非空的,那么它就是一个4节点。
这种方法的唯一问题是,如果指针实际上是无效(例如2节点的fourthChild
而不是仅仅未使用,则它需要指针为空。但并非所有有效的子指针都在使用中(例如,作为叶子的2节点的thirdChild
。)
所以一个解决方案是创建一个所有无效指针指向的节点,并且不以任何其他方式使用。从某种意义上说,它充当第二个NULL,与普通的不同之一。
请注意,哪种指针(无效或有效但未使用)指向NULL并指向虚假节点并不重要。 (另请注意,您可以对"第二个NULL"使用任何非NULL值,它不必是实际节点的地址,但您必须确定它永远不会成为实际节点的地址,无论如何,使用这种方法会让我感到紧张。)
答案 1 :(得分:0)
您需要向节点类添加“密钥总数”成员变量
class N234{ //node class
public:
N234(int x) : totalItems(1) { keys[0] = x; children[0] = 0; }
N234(int x, int y) : totalItems(2) {keys[0] = x; keys[1] = y; children[0] = 0;}
N234(int x, int y, int z) : totalItems(3) { keys[0] = x; keys[1] = y;
keys[2] = z; children[0] = 0; }
bool isLeaf() { return child[0] == 0 ? true : false }
bool isFourNode() { return totalItems == 4 : true : false}
private:
totalItems;
int keys[3];
N234 *children[4];
};
然后检查它是否是一个4节点。