向二叉搜索树添加节点
Add node to binary search tree
下面的代码应该在我的BST结构中添加一个节点,但是没有这样做。新节点不附加到树中,包括根节点。谁能指出问题在哪里?
树的构造函数:
template <typename K, typename T>
MyBinaryTree<K, T>::MyBinaryTree() {
root = nullptr;
}
从外部调用的函数:
template <typename K, typename T>
void MyBinaryTree<K, T>::addValue(K key, T value) {
Node *node = new Node(key, value);
addToSubtree(root, node);
}
和必须连接节点的内部私有函数:
template <typename K, typename T>
void MyBinaryTree<K, T>::addToSubtree(MyBinaryTree<K, T>::Node *node,
MyBinaryTree<K, T>::Node *toAdd) {
if(node == nullptr) {
node = toAdd;
} else {
if(toAdd->key > node->key) addToSubtree(node->right, toAdd);
else if(toAdd->key < node->key) addToSubtree(node->left, toAdd);
}
}
您应该使用引用,如:MyBinaryTree<K, T>::Node *&root
因为当你在addToSubtree
中修改root时,它只修改本地函数参数root,根参数的副本,而不是根参数本身。
你的node
变量是一个局部变量,包含指向Node
的指针,当你给它赋值时,它只适用于函数范围内的局部变量。
要使您的函数工作,您应该使node
变量指针指向指针(因此它被称为addToSubtree(&node->right, toAdd)
或指针引用)。
你的代码有两个问题:
- 虽然它应该代表面向对象的思想,但代码又回到了c风格。
root
元素不应该作为参数传递。它自动存在于每个成员函数作用域中,因为它是一个成员变量。
this:
template <typename K, typename T>
void MyBinaryTree<K, T>::addToSubtree(MyBinaryTree<K, T>::Node *root,
MyBinaryTree<K, T>::Node *toAdd) {
//rest...
}
应该是这样的:
template <typename K, typename T>
void MyBinaryTree<K, T>::addToSubtree( MyBinaryTree<K, T>::Node *toAdd) {
if(root == nullptr) {
root = toAdd;
} //rest...
}
函数已经知道root
是什么,因为root是成员变量。成员函数可以更改成员变量,而不需要将它们传递给函数
- 真正的问题是指针到指针到指针之间的差异。当我们想要一个函数改变给定的参数之一时,该参数应该作为指针或引用传递。
如果实参已经是一个指针,为了改变指针本身,它应该作为指针对指针或指针对
的引用传递。所以,让我们假设我们想继续传递root
作为一个参数(我们不),我们应该传递它作为
void MyBinaryTree<K, T>::addToSubtree(MyBinaryTree<K, T>::Node **root,
MyBinaryTree<K, T>::Node *toAdd) {
if(*root == nullptr) {
*root = toAdd;
//rest
作为
void MyBinaryTree<K, T>::addToSubtree(MyBinaryTree<K, T>::Node*& root,
MyBinaryTree<K, T>::Node *toAdd) {
if(root == nullptr) {
root = toAdd;
//the rest...
第二个更像c++风格,第一个更像C风格,但两者都是有效的
相关文章:
- 将树节点添加到向量向量中的 n 元树遍历的平均和最坏情况时间复杂度是多少?
- 在单链表前面添加一个节点后,我无法遍历每个节点
- 如何使用LLVM C++API向保留节点列表添加
- 如何确保我的节点被添加到链接列表中
- 如何将节点添加到链表
- 在 C++ 中使用 temp 变量将节点添加到链表的末尾
- 想要以最新的添加节点完整返回树节点的根
- 在列表末尾添加节点
- 如何在提升property_tree前面添加节点
- C++ & cocos2dx -- 无法以编程方式添加节点
- 链接列表C 类,这两个添加节点实现之间的差异是什么?
- 最后在C++的链表中添加节点
- 在ITH位置添加节点
- 单链表在中间添加节点
- 添加节点时C++二叉搜索树状态访问冲突错误
- boostpropertytree在循环中添加节点
- 正在链接列表前面添加节点
- 向二叉搜索树添加节点
- 程序不读取和添加节点到2双链表c++
- 向链表中添加节点