帮助插入第一个BST

时间:2011-04-27 02:15:09

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

编辑那里有一件我想念的小事!!错误仍然存​​在

所以我试图学习如何编写我的第一个BST代码,这很难....我已经遇到了几行代码的问题。问题在于插入,但我已经包含了所有内容,以便我可以获得有关我的样式/其他错误的一些反馈。我被建议使用一个指向指针实现的指针,但我们还没有学到它,所以我感觉不舒服/知道如何编码它。

错误是

[trinhc@cs1 Assignment_3]$ g++ movieList.cpp -o a.out
/tmp/ccLw6nsv.o: In function `main':
movieList.cpp:(.text+0x7a): undefined reference to `Tree::Tree()'
movieList.cpp:(.text+0xa7): undefined reference to `Tree::insert(int, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)'
collect2: ld returned 1 exit status

tree.h文件

#ifndef TREE_H
#define TREE_H

#include <string>
#include <iostream>
using namespace std;

class Tree
{
 public:
  Tree();
  bool insert(int k, string s);

 private:
  struct Node
  {
    int key;
    string data;
    Node *left;
    Node *right;
  };
  Node* root;
  bool insert(Node*& root, int k, string s);
};

#endif

tree.cpp

#include <iostream>
#include "tree.h"
#include <stack>
#include <queue>
#include <string>
using namespace std;

Tree::Tree()
{
  root = NULL;
}

bool Tree::insert(int k, string s)
{
  return insert(root, k, s);
}

bool Tree::insert(Node*& current_root, int k, string s)
{
  if(root == NULL){
    current_root = new Node;
    current_root->key = k;
    current_root->data = s;
    current_root->left = NULL;
    current_root->right = NULL;
    return true;
  }
  else if (current_root->key == k)
    return false;
  else if (current_root->key > k)
    insert(current_root->left, k, s);
  else
    insert (current_root->right,k, s);
}

movieList.cpp

#include <iostream>
#include <stack>
#include <queue>
#include <string>
#include "tree.h"


using namespace std;

int main()
{
  Tree test;
  test.insert(100, "blah");
  return 0;
}

4 个答案:

答案 0 :(得分:2)

树测试();不是如何定义类Test的对象,这实际上是声明了一个名为test的函数,它返回Tree。

树测试; test.insert(100,“blah”); 返回0;

答案 1 :(得分:1)

几点:

您需要将成员变量root的名称更改为其他内容 - 我建议使用m_root,my_root或tree_root,或者其他类似的东西。现在,在包含root作为参数的任何函数中,您都会遇到一些命名空间冲突。这也可以让你跟踪你所指的根。

bool Tree::insert(Node*& root, int k, string s)
{
    if(root == NULL){
        root = new Node;
        root->key = k;
        root->data = s;
        root->left = NULL;
        root->right = NULL;
        return true;
    } else
        if (root == k) //Comparison between pointer and number.
            return false;
        else
            if (root->key > k)
                insert(root->left, k, s);
            else
                insert (root->right,k, s);
    }

您需要将注释行上的root更改为root-&gt; key。

除此之外,看起来它会起作用。

编辑:另外,其他人说的是什么。您将对象声明为

TYPE name ()

如果要调用默认构造函数(),那么主函数中的代码应为

Tree test;
test.insert(...)

答案 2 :(得分:1)

我复制了一些代码,这对我来说很好用:

主:

#include <iostream>
#include <stack>
#include <queue>
#include <string>
#include "tree.h"

    int main()
    {
      Tree test;
      test.insert(100, "blah");
      test.insert(50, "fifty");
      test.insert(110, "one hundred ten");
      return 0;
    }

插入功能:

bool Tree::insert(Node*& currentRoot, int k, string s)
{
  if(currentRoot == NULL){
    currentRoot = new Node;
    currentRoot->key = k;
    currentRoot->data = s;
    currentRoot->left = NULL;
    currentRoot->right = NULL;
    return true;
  }
  else if (currentRoot->key == k)
    return false;
  else if (currentRoot->key > k)
    insert(currentRoot->left, k, s);
  else
    insert (currentRoot->right,k, s);
}

除此之外,你在整个地方都有语法错误。我也更改了名称,因为有人指出有一点命名问题。 CurrentRoot很有意义,因为你在每次递归时都将它传递给左或右子树的根。

答案 3 :(得分:0)

您不应该在构建命令中添加tree.cpp吗?

  

[trinhc @ cs1 Assignment_3] $ g ++   movieList.cpp -o a.out

会变成

  

[trinhc @ cs1 Assignment_3] $ g ++   tree.cpp movieList.cpp -o a.out