0

私は二分木プログラムに取り組んでいますが、挿入関数を呼び出すと、入力された値が挿入されているように見えます.その値をチェックしても何も得られず、何が欠けているのか、何が間違っているのでしょうか? クラス データと以下の挿入/検索関数の定義を提供しましたが、これはテンプレートの実装に関係しているのか、それとも一般的なヘルプのテンプレートに関係しているのでしょうか?

struct node
{
 string keyValue; //value to stored that is being searched for in our tree
 node *left; //left side of pointing tree from parent node
 node *right; //right side of pointing tree from parent node

};
template <class T> 
class Tree
{
  public: 
   Tree(); //constructor
  ~Tree(); //destructor

void displayTree();     
void insertTree(T key);
node *searchTree(T key);
void deleteTree();

private:

 node *root; //points to the root point of our tree
 void displayTree(node *leaf);
 void insertTree(T key, node *leaf); //takes in our keyValue to 
 void deleteTree(node*leaf);
 node *search(T key, node *leaf);
};

 template <class T>
 void Tree<T>::insertTree(T key)
 {
  cout << "instert1" << endl;
   if(root != NULL)
   {
    cout << "instert2" << endl;
    insertTree(key, root);
   }
   else
   {
    cout << "inster else..." << endl;
    root = new node;
    root->keyValue = key;
    cout << root->keyValue << "--root key value" << endl;
    root->left = NULL;
    root->right = NULL;
 }   

}

template <class T>      
void Tree<T>::insertTree(T key, node *leaf)
{
 if(key < leaf->keyValue)
 {
   if(leaf->left != NULL)
   { 
    insertTree(key, leaf->left); 
   }
   else //descend tree to find appropriate NULL node to store keyValue (left side of tree)
   {

     leaf->left = new node; //Creating new node to store our keyValue (data)
     leaf->left -> keyValue = key;
     leaf->left -> left = NULL; //Assigning left and right child of current child node to NULL
     leaf->left -> right = NULL;
   }
  }
   else if(key >= leaf->keyValue)
   {
     if(leaf->right != NULL)
     {
      insertTree(key, leaf->right);
     }
     else //descend tree to find appropriate NULL node to store keyValue (right side of tree)
     {
      leaf->right = new node; //Creating new node to store our keyValue (data)
      leaf->right -> keyValue = key;
      leaf->right -> right = NULL; //Assigning left and right child of current child node to NULL
      leaf->right -> left = NULL;
    }
  }     
}
    template <class T>
node *Tree<T>::searchTree(T key)
{
 cout << "searching for...key: " << key << " and given root value:" << endl;
  return search(key, root);
}
template <class T>
node *Tree<T>::search(T key, node*leaf)
{
  if(leaf != NULL)
  {
    cout << "check passed for search!" << endl;
    if(key == leaf->keyValue)
    {
       return leaf;
    }
    if(key < leaf->keyValue)
    {
      return search(key, leaf->left);
    }
    else
    {
      return search(key, leaf->right);
    }

  }

  else 
  {
    cout << key << " Not found...!" << endl;
    return NULL;
  }
}
4

1 に答える 1

0

あなたのコードはうまくいくようです。ここで見ることができます:http://ideone.com/w9Aa1w

あなたがする必要があるかもしれないことは、私がしたことですが、ノード構造体をテンプレート化することです...

template <typename T>
struct NodeStruct
{
 T keyValue; //value to stored that is being searched for in our tree
 NodeStruct<T> *left; //left side of pointing tree from parent node
 NodeStruct<T> *right; //right side of pointing tree from parent node
};

次に、ツリー クラスで、新しいノード タイプを「ノード」として typedef します。

typedef NodeStruct<T> node;

でもちゃんと挿入できたようです。

将来的には、あなたが抱えている正確な問題をより明確にし、プログラム全体を投稿するのではなく、問題を抱えているコードの少なくともサブセクションを特定することが役に立ちます。

この質問は漠然としていて、おそらく参考資料として他の人の役に立たないでしょう。

于 2013-10-10T04:08:05.337 に答える