【问题标题】:2-3-4 trees node members2-3-4 树节点成员
【发布时间】:2014-09-03 01:26:50
【问题描述】:

我真的很感激 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)已经有一些值时,我怎么知道节点是否已满(其中包含所有三个值)?

例如:
根:|4|根的左孩子:|1,2|
根|7,9|的右孩子

这里的根有一个值 (4)。我的问题是我们怎么知道它实际上有一个值,因为他所有的其他变量(secondData,thirdData)都有一些值(即使它是垃圾)..提前谢谢!

【问题讨论】:

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


    【解决方案1】:

    如果我们只关心内部节点,最简单的方法是查看子指针:

    如果thirdChild为null,则该节点是2-node,所以它只有一个有意义的值(firstData),其余的(secondDatathirdData)包含垃圾。

    如果thirdChild不为null,但fourthChild为null,则为3节点;前两个数据变量包含有意义的值。

    如果所有子指针都不为空,那么它是一个 4 节点。

    这种方法的唯一问题是它要求一个指针为空,如果它实际上是无效(例如,2 节点的thirdChild),而不仅仅是未使用。但并非所有有效的子指针都会被使用(例如,作为叶子的 2 节点的 firstChild)。

    所以一个解决方案是创建一个所有无效指针都指向的节点,并且不以任何其他方式使用它。在某种意义上,它充当第二个NULL,与普通的不同一个。

    请注意,哪种指针(无效,或有效但未使用)指向 NULL 以及指向假节点并不重要。 (另请注意,您可以为“第二个 NULL”使用任何非 NULL 值,它不必是实际节点的地址,但您必须确定它永远不会变成 实际节点的地址,无论如何使用这种方法会让我感到紧张。)

    【讨论】:

    • 所以如果我理解正确,叶子将指向假的,而其余无效(2 节点的第三个子节点)将指向 NULL?还是都会指向假的?
    • @CodeWiz94:如果他们都指向假货,那将破坏拥有假货的目的;无效指针和有效但未使用的指针之间必须存在可测试的差异,以便可以区分叶子 2 节点和叶子 3 节点之间的区别。
    • 好的,我明白了。但我的问题仍然存在。哪些节点被视为无效,哪些有效但未使用?
    • @CodeWiz94: (“Still stands”?这是你第一次问这个问题。)2 节点的 thirdChildfourthChild,以及 2 节点的 fourthChild 3节点,无效。叶节点的有效...Child 指针未被使用。您是否认为根的parent 无效或有效但未使用是任意的。所以考虑到这两组指针,invalid 和 valid-but-unused,一组的所有指针都应该为空,而另一组的所有指针都应该指向假节点;正如我在回答的最后一段中所说,选择是任意的。
    • 是的,这是对我第一条评论问题的参考。我的坏.. :) 无论如何,您的最后评论为我澄清了一切.. 非常感谢您的宝贵时间!
    【解决方案2】:

    您需要在您的节点类中添加一个“键总数”成员变量

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-02
      • 1970-01-01
      • 2012-01-22
      • 1970-01-01
      • 2011-05-02
      • 1970-01-01
      • 2011-02-04
      相关资源
      最近更新 更多