以下代码应该将节点添加到我的BST结构中,但是没有这样做。新节点根本不会附加到树上,包括根节点。谁能指出问题出在哪里?
树的构造函数:
hotel_list
从外部调用的函数:
var hotelData = JSON.parse(data);
function hotelList(){
var hotel_list = '';
for (i = 0; i < hotelData.length; i++) {
function list(index, hotel) {
hotel_list += '<li class="hotel" data-index="'+ index +'">'+ hotel.name +'</li>';
document.getElementById("hotel-listing").innerHTML = hotel_list;
};
};
};
document.addEventListener('DOMContentLoaded', function() {
hotelList();
});
必须附加节点的内部私有函数:
template <typename K, typename T>
MyBinaryTree<K, T>::MyBinaryTree() {
root = nullptr;
}
答案 0 :(得分:1)
您应该使用引用,例如:MyBinaryTree<K, T>::Node *&root
因为你在addToSubtree
修改root时,它只修改本地函数参数root,root参数的副本,而不是root参数。
答案 1 :(得分:0)
您的node
变量是一个包含指向Node
的指针的局部变量,当您为其赋值时,它仅适用于函数范围内的局部变量。
为了使你的函数有效,你应该创建一个指向指针的node
变量指针(所以它被调用为addToSubtree(&node->right, toAdd)
或者指向指针。
答案 2 :(得分:0)
您的代码存在两个问题:
root
元素作为参数传递。它在每个成员函数范围内都是自动存在的,因为它是一个成员变量。 这个:
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风格,但两者都是有效的。