我试图通过以下算法构建基于“二进制搜索树”的数组:
直到我需要真正实现,我的树类似于:
R
/
A
\
F
\
L
/
B
\
C
\
T
递归。但是,我注意到我需要回到根,“R”....现在尝试这样做..
void BST::insert(const data& aData)
{
item *y = NULL; // Algorithm calls for NULL assignment..
item *x = new item();
// How do i Init LEFT and RIGHT?
// With no nested copy ctor for struct item?
if ( items->empty )
{
items = new item();
items->empty = false;
items->theData = aData; // Get the data.
++size;
}
else if ( size == maxSize ) this->reallocate();
else
{
if ( aData < items->theData )
{
x[x->LEFT].theData = aData;
x->LEFT = x->LEFT + 1;
this->insert(items->theData);
}
else if ( items->theData < aData )
{
x[x->RIGHT].theData = aData;
x->RIGHT = x->RIGHT + 1;
this->insert(items->theData);
}
else this->insert(items->theData);
}
这是我在BST类对象文件的私有部分中的items数组的结构: ...
private:
int size; // size of the ever growing/expanding tree :)
int maxSize;
struct item
{
bool empty;
int LEFT;
int RIGHT;
data theData;
};
item *items; // The tree array
item *oldRoot;
int root_index; // index for the root(s)
嗯。我也超载了赋值运算符......我不知道该说些什么。这个很难(硬。我在网上看了很多例子和讲座;以及算法......
请求的relloaction方法:
void BST::reallocate()
{
item *new_array = new item[size*2];
for ( int array_index = 0; array_index < size; array_index++ )
{
new_array[array_index].theData = items[array_index].theData;
new_array[array_index].empty = false;
}
size *= 2;
delete [] items;
items = NULL;
items = new_array;
}
答案 0 :(得分:3)
有完善的方法将二叉树实现为数组,它表示根位于索引0,索引 i 的元素的LEFT
将在2i + 1处找到RIGHT
将在2i + 2处找到。您不需要将LEFT和RIGHT作为结构的一部分。
它必须是
struct item
{
int index;
data theData;
};
NOT 在您的结构中存储左索引和右索引。您也不需要跟踪根索引。始终为0.在二叉树上查看wiki article。搜索“存储二叉树的方法”字符串。 如果需要,此实现允许轻松遍历树。