二叉树(在半径内插入和搜索)

时间:2015-10-29 19:13:05

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

我正在编写二叉树搜索程序,但我不确定如何添加节点并搜索它们。节点来自正在使用不同文件读取的.txt文件,因此假设已经有效。

文本文件如下所示: 名称位置 旧楼31.2222 新楼21.2111

就像我说的那样,程序已经读入了文件,所以这不是问题。但是,我必须将名称和位置插入二叉树的节点中。然后我必须搜索加减号来自的范围内的所有内容。

附注:我的复制构造函数可能也不正确,但它符合正确。

感谢您的帮助!

#ifndef BINTREE_HPP
#define BINTREE_HPP

#include <utility>
#include <string>
#include <vector>

class bintree {

// A binary search tree for locations in Lineland.

// Notes: 
// - Assume a flat, one-dimensional world with locations from -180 to 180.
// - All locations and distances are measured in the same units (degrees).

public:
// Default constructor
bintree() {
   this->root = NULL;
}

// Copy constructor
bintree(const bintree &t) {
  this -> root = NULL;
*this = t;
 }

// Destructor
~bintree() {

}


 // Copy assignment is implemented using the copy-swap idiom

 friend void swap(bintree &t1, bintree &t2) {
 using std::swap;
 // Swap all data members here, e.g.,
 // swap(t1.foo, t2.foo);
 // Pointers should be swapped -- but not the things they point to.
 }
 bintree &operator= (bintree other) {
 // You don't need to modify this function.
 swap(*this, other);
 return *this;
 }

 void insert(const std::string& name, double p) {
   // insert node with name and location (p)
 }

 void within_radius(double p, double r, std::vector<std::string> &result) const {
  // Search for elements within the range `p` plus or minus `r`.
  // Clears `result` and puts the elements in `result`.
  // Postcondition: `result` contains all (and only) elements of the
  // tree, in any order, that lie within the range `p` plus or minus
  // `r`.
  }

private:

struct node
{
 node *left;
 node *right;

};

node* root; 

};

#endif

1 个答案:

答案 0 :(得分:0)

首先,您的节点需要保存数据:

struct node
{
 node *left;
 node *right;
 std::string name;  // This is the key for your reasearch
 double p;          // followed by other data 
};

然后,您可以考虑浏览树以插入新节点。 在此示例中,我假设您可以插入多个具有相同名称的节点。

void insert(const std::string& name, double p) {
   node *n = new node;       // create a new node
   n->name=name; n->p=p;     // intialise the data payload
   n->left=n->right=nullptr; // and make it a leaf.

   if (root==nullptr)        // if tree is empty, 
      root = n;                   // add the new node. 

   else {                    // else find where to insert it
      node* t=root; 
      while (true) {
          if (t->name > n->name) {     // go to left
              if (t->left==nullptr) {
                 t->left = n;     
                 break;  
              }
              else t=t->left; 
          }
          else if (t->name == n->name) { // insert between current and next
              n->right = t->right; 
              t->right = n; 
              break; 
          }
          else {                         // go to right 
              if (t->right==nullptr) {
                 t->right = n;     
                 break;  
              }
              else t=t->right; 
          }
       }
    }
 }

这是live demo

请注意,我只回答了您的插入问题,您仍需要自己做很多事情(operator =和复制构造函数需要查看,需要创建析构函数等等)