我需要更多关于我的BST的帮助。这是我的BST在插入时的样子:
R,L,J,G
R --Root at Index 0
/ \
L @ Index1 L NULL
/ \
J @ Index3 J NULL
/ \
G @ Index7 G NULL
这是实现它的代码。
void BST::insert(const data &aData)
{
if ( items[Parent].empty )
{
items[Parent].theData = aData; // insert at leaf.
items[Parent].empty = false;
size++;
return;
}
for ( int i = 0; i <= size; i++ )
{
if ( aData < items[Parent].theData )
{
if ( items[2*i+1].empty )
{
items[2*i+1].theData = aData;
items[2*i+1].empty = false;
}
else
{
// we must already have a left child to some root.
Parent++; So make the previous data the root???
if ( items[Parent].empty )
{
items[Parent].theData = items[2*i+1].theData;
items[Parent].empty = false;
Parent = (i-1)/2;
}
}
}
else
{ ...// do the same for data greater than but with items[2*i+2] }
我的问题是我什么时候需要建立新根? 我什么时候需要新的根?为了重新比较?
这种做法是否正确?感谢那些甚至两人都看我的帖子:)
//构造函数BST类及其私有部分。
BST::BST(int capacity) : items(new item[capacity]), size(0), Parent(0),
leftChild(0), rightChild(0)
{
items->empty = true;
maxSize = capacity;
}
private:
int size; // size of the ever growing/expanding tree :)
int Parent;
int maxSize;
int leftChild;
int rightChild;
struct item
{
bool empty;
data theData;
};
item *items; // The tree array
答案 0 :(得分:1)
你的逻辑(我必须说相当模糊)似乎是错误的: 这是什么样的“if”序列?
if ( items[2*i+1].empty )
{
}
else if (!items[2*i+1].empty)
{
if ( items[2*i+1].empty )
{
// any code here is unreachable
}
}
答案 1 :(得分:1)
我建议你重新实现这个以递归方式工作。像这样:
void BST::insert(const data& aData, int pos) {
if (items[pos].empty) {
// insert it here
}
else (aData < items[pos].theData) {
// go to left child
insert(aData, 2*pos + 1);
}
else {
// go to right child
insert(aData, 2*pos + 2);
}
}
目前还不清楚Parent,leftChild和rightChild在你的课堂上做了什么,但这是一个单独的问题。