我正在学习C ++并编写二叉搜索树。以下是我为insert方法编写的代码。
BSTNode * BST::Insert(const std::string & v) {
BSTNode *n = !root ? root = new BSTNode(v) : Insert_Helper(v,root);
if(n) size++;
return n;
}
BSTNode * BST::Insert_Helper(const std::string & v, BSTNode *n) {
if(!n->value.compare(v))
return NULL; // already have v
else if(n->value.compare(v) > 0) // v goes to the left
if(n->left) return Insert_Helper(v,n->left);
else return n->left = new BSTNode(v);
else // v goes to the right
if(n->right) Insert_Helper(v,n->right);
else return n->right = new BSTNode(v);
}
我得到的错误是这样的:一切正常,花花公子,直到我尝试插入一个重复的节点。它不会添加新节点,但会增加计数。
通过在GDB中观察,我发现当我尝试添加我已经拥有的字符串时,Insert_Helper
正常工作并返回NULL。然而,这个值(在我的机器上)就像0x6,当然超出界限,但不像我想的那样是0x0。我认为这会导致我有if(n)语句的问题。在这种情况下,n的计算结果为true,因此将大小增加一倍。
此外,在我的程序中,节点继续正确添加节点,但我的插入函数继续返回0x6作为地址,即使它们确实位于我可以访问的内存中的有效位置。
任何人都可以给我任何关于我可能做错的指示吗?
答案 0 :(得分:6)
您的编译器可能应该已经发现了这一点,但这一行接近您的帮助程序结束:
if(n->right) Insert_Helper(v,n->right);
您可能应该返回Insert_Helper
返回的内容:
if(n->right) return Insert_Helper(v,n->right);
答案 1 :(得分:0)
您可以将if(n) size++
更改为if (n != NULL) size++