将节点添加到二叉搜索树

时间:2015-10-25 16:22:25

标签: c++ c++11 binary-search-tree

以下代码应该将节点添加到我的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;
}

3 个答案:

答案 0 :(得分:1)

您应该使用引用,例如:MyBinaryTree<K, T>::Node *&root

因为你在addToSubtree修改root时,它只修改本地函数参数root,root参数的副本,而不是root参数。

答案 1 :(得分:0)

您的node变量是一个包含指向Node的指针的局部变量,当您为其赋值时,它仅适用于函数范围内的局部变量。

为了使你的函数有效,你应该创建一个指向指针的node变量指针(所以它被调用为addToSubtree(&node->right, toAdd)或者指向指针。

答案 2 :(得分:0)

您的代码存在两个问题:

  1. 虽然它应该代表面向对象的思想,但代码却回归到C风格的做事。不应将root元素作为参数传递。它在每个成员函数范围内都是自动存在的,因为它是一个成员变量。
  2. 这个:

       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是一个成员变量。 成员函数可以更改成员变量,而无需将它们传递给函数

    1. 真正的问题是指针与指向的指针之间的区别。 每当我们想要一个函数来改变给定的一个参数时,该参数应该作为指针或引用传递。
    2. 如果参数已经是指针,为了更改指针本身,它应该作为指针指针传递或指向指针

      所以,我们假设我们确实希望继续传递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风格,但两者都是有效的。