0

我有一堂课Tree

class Tree {
    string aboutTree;
    vector<int> veryImportantInfo;
    Tree* leftChild;
    Tree* rightChild;
    ...
    void veryImportantMethod() {
        // change and use aboutTree
        // change and use veryImportantInfo
    }
};

aboutTree并且veryImportantInfo不是恒定的,但对于树的所有节点都是相同的,我不想在所有节点中复制它。我想要这样的东西:

class Tree {
    //string aboutTree;
    //vector<int> veryImportantInfo;
    Tree* leftChild;
    Tree* rightChild;
    ...
    void veryImportantMethod() {
        // change and use aboutTree
        // change and use veryImportantInfo
    }
};

class TreeWrapper {
    string aboutTree;
    vector<int> veryImportantInfo;
    Tree root;
    ...

};

但这是行不通的,因为我无法访问TreeWrapper.

4

1 回答 1

1

我想出的一个可能的粗略解决方案是将所有分支链接回包装器并直接访问数据:

请注意,我TreeWrapper Tree Tree 替换 branch了,因为它对我来说更有意义。

class tree
{
public:
    struct branch
    {
        branch* leftChild;
        branch* rightChild;
        tree* parent;
        void veryImportantMethod() {
            // change and use parent->aboutTree
            // change and use parent->veryImportantInfo
        }
    };
    tree() { root.parent = this; }
    tree root;
    string aboutTree;
    vector<int> veryImportantInfo;
};

每当您创建一个新的branch时,您都需要拥有leftChild->parent = parent;. 并且您还希望定义成员函数branch来为您执行此操作,就像在双向链表中一样。

另一种解决方案是使用实际的双向链表格式。tree* parent也会如此branch* parent。从分支访问重要信息不会像上面那样快,但这意味着它会更易于导航。您可以更轻松地绕过树。(实际上两者兼而有之tree* rootbranch* parent可能不是一个坏主意。但更精细的细节取决于您。)

于 2013-09-25T03:01:00.063 回答