2-3-4树节点成员

时间:2014-06-15 23:28:33

标签: c++ data-structures 2-3-4-tree

我真的很感激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)都有一些值(即使它是垃圾)...提前谢谢!

2 个答案:

答案 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节点。