如何设计C ++树和节点类?

时间:2012-10-07 05:01:05

标签: c++ data-structures tree

我所做的如下所示,但是在这个问题上,我在破坏树时遇到了很多问题,并且在尝试打印树时(基本上我需要在树上使用递归)。

这是因为在尝试在右子树的左侧递归调用print时,我的方法会中断,因为我的左右子树实际上只有Node s而不是Tree s 。所以,我需要将我的Nodes命名为树,或者我需要创建新树,这两种树都是难看的解决方案。

我认为这里的问题是课堂设计。你能评论一下吗?谢谢!

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);
};

3 个答案:

答案 0 :(得分:8)

为什么不让Node成为您的树类?根据定义,非空节点是某个树的根。这将大大简化您的代码,因为您不需要为TreeNode制作不同的案例。

答案 1 :(得分:4)

更改Node的析构函数,以便删除其左右子项。然后为你的Tree析构函数删除root,所以:

~Tree() {
   delete root;
}

~Node() {
   delete left;
   delete right;
}

答案 2 :(得分: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;
    }