我只是在插入数组时遇到了麻烦...让孩子从根分支出来,或者是“父母”......
我一直在尝试将数据插入到基于数组的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
}
答案 0 :(得分:2)
我看到一些问题。 leftChild
和rightChild
应该是项结构的成员,而不是BST的成员,因为它们对于每个项都是不同的(或者它们不应该作为字段存在并且是动态计算的)。我发现没有代码可以将leftChild
和rightChild
设置为任何内容。
看起来你正试图以递归方式定义insert
。您应该定义一个插入辅助函数,它既可以获取项目,也可以获取插入点的索引。这应该让你走上正轨。
wikipedia article有更多可以查看的伪代码。