0

この簡単な質問があります。私が行う主な機能ではbsearch_tree bs1;、BSTツリーでアナウンスします。次に、そのツリーにノードを追加します。次に、別の BST ツリーでアナウンスします。bsearch_tree bs2;ノード (異なる) をもう一度追加します。

それが行うことは、房 bs1 と bs2 の両方に同じノードを追加することです。両方のツリーを印刷すると、同じであることがわかりますが、同じであってはなりません。それは間違っています。

デバッグしようとしたところ、ノードを追加すると、それらが同じツリーに追加されることがわかりました。

どういうわけか、木を区別する必要があります。

クラスの新しいインスタンスを作成する必要があると思いますがbsearch_tree、 Main 関数を変更することはできません (制限)。

ヘッダーファイルは次のとおりです。

#include<iostream>

using namespace std;

class tnode
{
private:
    double data;
    tnode *left;
    tnode *right;
public:
    tnode(double key);
    friend class bsearch_tree;
    friend void assist(tnode *tmp);
    friend ostream& operator<<(ostream& stream,tnode const *root);
};
class bsearch_tree
{
    tnode *root;
public:
    bsearch_tree();
    bsearch_tree(int);
    void duplicate_tree(tnode *root,tnode **new_root);
    void free_tree(tnode *node);
    void add_value(double v);
    tnode copy(tnode *root);
    bsearch_tree operator + (const bsearch_tree & t);
    bsearch_tree & operator=(const bsearch_tree & v);
    friend void print(bsearch_tree tree);
    friend ostream& operator<<(ostream& stream,bsearch_tree const root);
private:
    void AddNode(double key,tnode *leaf);
    void SumTree(tnode *tree);
};

コードファイルは次のとおりです。

#include<iostream>
#include "head.h"

using namespace std;

tnode::tnode(double key)
{
    this->data = key;
    this->left = NULL;
    this->right = NULL;
}

bsearch_tree::bsearch_tree()
{
    bsearch_tree *root = new bsearch_tree(NULL);
    //root = NULL;
}

bsearch_tree::bsearch_tree(int)
{
    //bsearch_tree *root = new bsearch_tree(NULL);
    root = NULL;
}

void bsearch_tree::duplicate_tree(tnode *root,tnode **new_root)
{
    if(root == NULL)
        return;
    (**new_root) = copy(root);
}

tnode bsearch_tree::copy(tnode *root)
{
    tnode* node = new tnode(root->data);
    if(root == NULL)
        return *node;
    copy(root->left);
    copy(root->right);
    return *node;
}

void bsearch_tree::free_tree(tnode *node)
{
    if(node == NULL)
        return;
    free_tree(node->left);
    free_tree(node->right);
    free(node);
}

void bsearch_tree::add_value(double v)
{
    tnode *tmp;
    if(root == NULL)
    {
        tmp = new tnode(v);
        root = tmp;
    }
    else
        AddNode(v,root);
}
void bsearch_tree::AddNode(double key,tnode *leaf)
{
    if(key >= leaf->data)
    {
        if(leaf->right != NULL)
            AddNode(key,leaf->right);
        else
        {
            tnode * n = new tnode(key);
            leaf->right = n;
        }
    }
    else
    {
        if(leaf->left != NULL)
            AddNode(key,leaf->left);
        else
        {
            tnode * n = new tnode(key);
            leaf->left = n;
        }
    }
}

void print(bsearch_tree tree)
{
    assist(tree.root);
}

void assist(tnode *tmp)
{
    if(tmp)
    {
        assist(tmp->left);
        cout << tmp->data << endl;
        assist(tmp->right);
    }
}

ostream & operator << (ostream & stream,bsearch_tree const root)
{
    print(root);    
    return stream;
}


bsearch_tree bsearch_tree::operator + (const bsearch_tree & t)
{
    bsearch_tree bs;
    SumTree(t.root);
    return *this;
}

void bsearch_tree::SumTree(tnode *tree)
{
    if(tree)
    {
        AddNode(tree->data,root);
        SumTree(tree->left);
        SumTree(tree->right);
    }
}

bsearch_tree & bsearch_tree::operator = (const bsearch_tree & v)
{
    if(this == &v)
        return *this;

    root = v.root;
    return *this;
}

int main()
{
  bsearch_tree bs1;

  bs1.add_value(16.0);  
  bs1.add_value(14.0);  
  bs1.add_value(6.0);  
  bs1.add_value(18.0);  
  bs1.add_value(17.0);  
  bs1.add_value(4.0);  
  bs1.add_value(5.0);  
  bs1.add_value(1.0);  
  bs1.add_value(26.0);  
  bs1.add_value(22.0);  

  cout << "bs1:" << endl;
  print(bs1);

  bsearch_tree bs2;

  bs1 = bs1 = bs1;
  bs2 = bs1;

  bs2.add_value(40.0);
  bs2.add_value(20.0);
  bs2.add_value(60.0);

  cout << "cout << bs2" << endl;
  cout << bs2;

  bsearch_tree bs3;

  //bs3 = bs1 + bs2;
  bs3 = bs1;

  cout << "cout << bs3" << endl;
  cout << bs3; 
  cin.get();
  return 0;
} // main

だから私の質問は次のとおりです。メイン関数ではbsearch_tree bs1;、次のようにいくつかのノードを追加bs1.add_value(16.0);します。次にbsearch_tree bs2;、いくつかのノードを追加します。次に、ツリー bs1 と bs2 の両方を出力すると、それらが等しいことがわかりましたが、これは正しくありません。

add_value異なるツリーにノードを追加するメソッドを作成するにはどうすればよいですか? したがって、両方のツリーを印刷すると、最初に入力したノードが異なるため、異なるツリーが得られます。

ありがとう

4

1 に答える 1

0

あなたoperator=は間違っています。2 番目のツリーの同じルートを指すようにルートを設定しています。したがって、この演算子を使用する時点から (たとえば、bs2 = bs1; で)、両方のツリーが同じ共有データをアドレス指定します。ツリー データのコピーを作成する方法で代入演算子を実装する必要があります。

于 2012-12-28T08:59:25.310 に答える