【问题标题】:Red Black Tree Insertion Not Working红黑树插入不起作用
【发布时间】:2015-01-07 13:36:20
【问题描述】:

我正在为我的班级分配红黑树作业,但插入函数遇到了一些问题。我的问题是我的根节点值在插入函数结束和再次调用插入开始之间以某种方式发生了变化。我通过 Visual Studio 中的调试器运行它,发现没有理由像现在这样更改根密钥。到目前为止,我确信我的代码中还有许多其他错误,因为我决定在程序的其余部分之前先关注这一点。解决此问题后,我将返回并更正其他错误。我还没有实现用于在插入后更正树的修复功能,所以不要担心会遇到红黑树属性。如果您有任何问题或我没有提供足够的信息,请告诉我。

/ rbtree.cpp 

#include <iostream>
#include <iomanip>
#include "rbtree.h"

using std::cout;
using std::setw;
using std::endl;

void RBTree::reverseInOrderPrint(Node *x, int depth) {
   if ( x != nil ) {
      reverseInOrderPrint(x->right, depth+1);
      cout << setw(depth*4+4) << x->color << " ";
      cout << *(x->key) << " " << *(x->value) << endl;
      reverseInOrderPrint(x->left, depth+1);
   }
}


RBTree::RBTree()
{
    nil = new Node();
    root = nil;
}

RBTree::~RBTree()
{
    //delete[] root;    
}


void RBTree::rbInsert(const string& key_given, const string& value_given)
{
    //if(root != nil)
        //cout << *(root -> key) << " <- root key at beginning of insert function" << endl;


    Node* input_node = new Node(key_given, value_given, nil);
    Node* target = root;
    Node* target_parent = nil;



    while(target != nil)
    {

        target_parent = target;

        if(input_node -> key -> compare(*(target -> key)) < 0)
            target = target -> left;

        else
            target = target -> right;


    }


    input_node -> parent = target_parent;

    if(target_parent == nil)
        root = input_node;

    else if(input_node -> key -> compare(*(target_parent -> key)) < 0)
        target_parent -> left = input_node;

    else
        target_parent -> right = input_node;

    input_node -> left = nil;

    input_node -> right = nil;

    input_node -> color = 'R';

    /*rbInsertFixup(input_node);
    cout << *(root -> key) << " <- root key at end of insert function" << endl;
    if(root -> left != nil)
        cout << *(root -> left -> key) << " is root's left child" << endl;
    if(root -> right != nil)
        cout << *(root -> right -> key) << " is root's right child"  << endl;*/

}


//void RBTree::rbInsertFixup(



RBTree::Node::Node()
{
    parent = NULL;
    left = NULL;
    right = NULL;
    color = 'B';
    key = NULL;
    value = NULL;
}


RBTree::Node::Node(const string& key_given, const string& value_given, Node* nil_pntr)
{
    parent = nil_pntr;
    left = nil_pntr;
    right = nil_pntr;
    color = 'R';
    key = &key_given;
    value = &value_given;
}


RBTree::Node::~Node()
{
    if(left != NULL)
        delete left;
    if(right != NULL)
        delete right;

}

int main()
{
        RBTree tree;

        tree.rbInsert("Zack", "His Birthday");
        tree.rbInsert("Terri", "Her Birthdays");
        tree.rbInsert("Zzck", "HBD");

        return 0;
}

这是我在运行此代码时得到的输出示例:

Zack <- root key at end of insert function
Terri <- root key at beginning of insert function
Terri <- root key at end of insert function
Terri is root's right child
Zzck <- root key at beginning of insert function
Zzck <- root key at end of insert function
Zzck is root's right child

【问题讨论】:

  • 有人对此有任何答案吗?我还是想不通:/

标签: insert tree red-black-tree


【解决方案1】:

您需要比较 2 个字符串,您必须取消对 input_node->key 的引用,并且因为您正在使用比较来检查两个字符串,请尝试使用“”,我很确定它会像这样这个 * (input_node -> key) key)

【讨论】:

    猜你喜欢
    • 2017-01-26
    • 2018-11-06
    • 2013-11-17
    • 2020-07-25
    • 2018-05-30
    • 1970-01-01
    • 2017-12-23
    • 2013-02-28
    相关资源
    最近更新 更多