0

C++でツリーを作成したい。エラーや警告なしでコードをコンパイルできましたが、出力が得られません。

エラーは inorder fn にあると思いますが、これを削除する方法がわかりません。

#include<iostream.h>
#include<conio.h>
#include<stdlib.h>

struct tree
{
    int data;
    struct tree * left;
    struct tree * right;
};
typedef struct tree * TREE;

TREE maketree(int x)
{
    TREE tree = (TREE)malloc(sizeof(tree));
    if(tree == NULL)
    {
        return NULL;
    }
    tree->left = tree->right = NULL;
    tree->data = x;
return tree;
}

void setleft(TREE tree,int x)
{
    if(tree == NULL || tree->left != NULL)
    {
        cout<<"\t Error !! Inserting New Node At Left Side  !\n";
    }
    else
    {
        tree->left = maketree(x);
    }
}

void setright(TREE tree,int x)
{
    if(tree == NULL || tree->right != NULL)
    {
        cout<<"\t Error !! Inserting New Node At Right Side !\n";
    }
    else
    {
        tree->right = maketree(x);
    }
}

void inorder(TREE root)
{
    if(root != NULL)
    {
        TREE left=root->left;
        TREE right=root->right;
        inorder(left);
        cout<<root->data;
        inorder(right);
    }
}

void main()
{
clrscr();
    TREE root = NULL,child,parent;
    int i,j = 1;
    cout<<"Root Of Binary Search Tree :- ";
    cin>>i;
    root = maketree(i);
    cout<<"\n\n";
    while(i)
    {
        cout<<j<<" Node Value:- ";
        cin>>i;
        if(i < 0)
        {
            break;
        }
        parent = child = root;
        while((i != parent->data) && (child != NULL))
        {
            parent = child;
            if(i < parent->data)
            {
                child = parent->left;
            }
            else
            {
                child = parent->right;
            }
        }
        if(i == parent->data)
        {
            cout<<"\t Value "<<i<<" Already Present In BST !!\n";
        }
        else if(i < parent->data)
        {
            setleft(parent,i);
        }
        else
        {
            setright(parent,i);
        }
        j++;
    }
    inorder(root);
getch();
}
4

1 に答える 1

3

C++ で書きたい場合は、C++ で書きます。コンストラクタとデストラクタ、およびクラス メソッドを使用します。おそらく、データ メンバーを非公開にします。newではなく使用するmallocと、デストラクタはおそらく削除したいと思うでしょう(ツリーの子ノード)。

あなたが書いたものは、C++ の最悪の機能である iostream と、その古い非推奨の非標準バージョンに組み込まれていることを除いて、C で書かれています。

これは学校の演習のようです。

freeまた、割り当てたデータがどこにあるのかわかりませんmalloc

並べ替えロジックは、メインではなく、ツリーベースの関数にする必要があります。

あなたの「エラー」は、出力に空白がないことかもしれませんが、わかりません。

treeデータ型 (構造体であり、C++ では構造体で修飾する必要がない) と変数 (よく使用される) の両方として使用することは合法ですが、良い習慣ではありません。

わかりました、今は少しコードです。主にあなたのものに基づいています。

class tree
{
    tree * left;
    tree * right;
    int value;

public:
    explicit tree( int v );
    ~tree();

    bool insert( int v );
    void print( std::ostream& ) const;

private:
    tree( const tree& );
    tree& operator=( const tree& );

};

tree::tree( int v ) : 
   left( NULL ), 
   right( NULL ),
   value( v )
{
}

tree::~tree()
{
    delete right;
    delete left;
}

bool tree::insert( int v )
{
   // inserts v in the correct place in the tree, returns true
   // if it inserted or false if it already exists

   // I want you to fill in the detail for this function
}

void tree::print( std::ostream& os ) const
{
   // prints the tree
    if( left )
    {
       left->print( os );
    }
    os << value << '\n';
    if( right )
    {
       right->print( os );
    }
}

そこで、実装する関数を 1 つ残しました。プライベート コピー コンストラクターまたは代入演算子を実装する必要はありません。

も実施main()。ヒープ上にメインのツリーを実装する必要がないことに注意してください (with new)。スタックに実装します。

main()数値を読み取り、そのinsert()メソッドを呼び出してツリーに挿入し、最後にパラメーターとして渡してツリーを出力std::coutします。

#include <iostream>(iostream.hではなく)する必要があり、動作します。

于 2012-10-16T09:31:28.367 に答える