二进制搜索树阵列Imp。 C ++

时间:2009-11-10 23:35:13

标签: c++ arrays binary-tree

我只是在插入数组时遇到了麻烦...让孩子从根分支出来,或者是“父母”......

我一直在尝试将数据插入到基于数组的BST实现中:

BST::BST(int capacity) : items(new item[capacity]), size(0)
{
     // define the constructor to the BST Class.
}

void BST::insert (const data& aData)
{
    if ( items[root].empty ) // make the first data the root.
    {
        items[root].theData = aData;
        items[root].empty = false;
        size++;
    }
    else if ( items[root].theData.getName() < aData )
    {
        items[leftChild].theData = aData; // will be overwritten...
        this->insert(aData);
    }
    else if ( aData < items[root].theData.getName() )
    {
        items[rightChild].theData = aData;
        this->insert(aData);
    }   
}   

这有些问题。首先我要说的是,第一个输入数据将是根。所有其他数据将与其进行比较。当我进行“插入”的递归调用时,基本上就是我“思考”我“遍历”(如果它是一个链表)。我的主要问题是知道我的左右孩子会被覆盖。我想知道如何保持孩子“节点”的分支......?

这是我的BST课程的头文件,我也担心我是否已将成员设置正确以及所有内容..?

class BST
{ 
public:
    BST(int capacity = 5);
    BST(const BST& aTable);

    void insert(const data& aData);
         ....
 private:
    int size;  // size of the ever growing/expanding tree :)

    struct item
    {
        bool empty;
        data theData;
    };

    item  * items;    // The tree array
    int   rightChild; // access to the RHS
    int   leftChild;  // access to the LHS
    int   root;   // index to the root
};

我有另一个源文件,“数据”,我正在进行调用,“getname”。到目前为止我定义的三个简单方法是赋值运算符重载,比较'&lt;'重载和数据类的ctor:

data::data(char const * const name) : name(new char[strlen(name)+1])
{
    if (name)
    {
        strcpy(this->name , name);
    }  
    else this->name = NULL;
}

data& data::operator=(const data& data2)
{ 
    if ( this != &data2 ) // check for selfassignment
    {
        delete [] name;
        name = NULL;

        this->name = new char[strlen(data2.name)+1];
        strcpy(this->name , data2.name);
    }
    return *this;
     }

bool operator< (const data& d1, const data& d2)
{
    if ( strcmp( d1.getName(), d2.getName() ) == -1 )
    {
        return false;
    }
    else if ( strcmp( d1.getName(), d2.getName() ) == 1 )
    {
        return true;
    }
    return false; // if they are equal return false
}    

1 个答案:

答案 0 :(得分:2)

我看到一些问题。 leftChildrightChild应该是项结构的成员,而不是BST的成员,因为它们对于每个项都是不同的(或者它们不应该作为字段存在并且是动态计算的)。我发现没有代码可以将leftChildrightChild设置为任何内容。

看起来你正试图以递归方式定义insert。您应该定义一个插入辅助函数,它既可以获取项目,也可以获取插入点的索引。这应该让你走上正轨。

wikipedia article有更多可以查看的伪代码。