4

私がやったことは以下のとおりですが、これにより、ツリーを破壊したり、ツリーを印刷しようとしたりするときに(基本的にはツリーで再帰を使用する必要がある場所で)多くの問題が発生します。

これはprint、右側のサブツリーの左側で再帰的に呼び出そうとしているときに、左側と右側のサブツリーが実際にはNodesであり、sではないため、メソッドが機能しなくなるためTreeです。したがって、ノードをツリーにタイプケース化するか、新しいツリーを作成する必要があります。どちらも醜いソリューションです。

ここでの問題はクラスの設計にあると思います。同じことについてコメントしていただけますか?ありがとう!

class Node {
    int _data;
public:
    Node* left;       // left child
    Node* right;      // right child
    Node* p;          // parent
    Node(int data) {
        _data = data;
        left = NULL;
        right = NULL;
        p  = NULL;
    }
    ~Node() {
    }
    int d() {
        return _data;
    }
    void print() {
        std::cout << _data << std::endl;
    }
};

class Tree {
    Node* root;
public:
    Tree() {
        root = NULL;
    }
    Tree(Node* node) {
        root = node;
    }
    ~Tree() {
        delete root->left; // this is NOT RIGHT as
                           // it only deletes the node
                           // and not the whole left subtree
        delete root->right;
        delete root;
    }

    void print(int);
    void add(int);
};
4

3 に答える 3

8

どうしてあなたはただNodeあなたのツリークラスになることを許しませんか?空でないノードは、定義上、ツリーのルートです。Treeこれにより、とのケースを変える必要がないため、コードが大幅に簡素化されますNode

于 2012-10-07T05:05:13.307 に答える
4

Nodeのデストラクタを変更して、左右の子を削除します。次に、Treeデストラクタの場合はrootを削除するだけなので、次のようになります。

~Tree() {
   delete root;
}

~Node() {
   delete left;
   delete right;
}
于 2012-10-07T05:04:00.307 に答える
0
public:
~Tree() {
        clear();
        delete root;
    }

    void clear()
    {
        recursive_delete(root);
    }
private:
    void recursive_delete(Node* node)
    {
        if (node!=NULL)
        {
            recursive_delete(node->left);
            recursive_delete(node->right);
            deleteNode(node);
        }
    }
    void deleteNode(Node* node)
    {
        delete node;
        node = NULL;
    }
于 2012-10-07T08:28:50.027 に答える