数组和二叉树的构造函数

时间:2017-04-11 15:59:38

标签: c++

我正在使用STD矢量制作二叉树。我已经大大减少了它,但总体思路如下:

template <class DataType>
class ArrayNode
{
protected:
    DataType* _info;
    int _left; //index position of left node
    int _right;//index position of right node

public:
    ArrayNode(const DataType& info, int left, int right);
    virtual ~ArrayNode();
    DataType& getInfo();
}

template <class DataType>
class ArrayBinaryTree
{
protected:
    vector<ArrayNode<DataType>* >* theBinaryTree;
    int _root;
    int _numOfNodes;
    int _size; 
    //etc.
public:
    ArrayBinaryTree(DataType info);
    virtual ~ArrayBinaryTree();
}

您将如何创建构造函数以便可以使用getInfo()访问节点?我的想法是这样做:

std::vector<ArrayNode<DataType>*> binaryTree(1);

ArrayBTNode<DataType>* element = new ArrayNode<DataType>(info, -1, -1); //some generic data
binaryTree.insert(binaryTree.begin(), 1, element);
theBinaryTree = &binaryTree;

然后使用(*theBinaryTree->at(0)).getInfo()之类的内容进行访问。 但是,使用此类构造函数,getInfo()会返回null。设置构造函数以进行访问的更好方法是什么?

1 个答案:

答案 0 :(得分:3)

让我稍微改变界面,因为我没有看到将矢量保存为指针的意义。存储在向量中的数据和节点中的数据也是如此:

template <class DataType>
class ArrayNode
{
protected:
    DataType _info;
    // ... rest of ArrayNode interface
}

template <class DataType>
class ArrayBinaryTree {
protected:
    vector<ArrayNode<DataType> > theBinaryTree; // not pointers anymore
    int _root = -1; // something that tells you no values are present
    // You need size and numOfNodes attributes
    // You get both of these things by calling size() method of std::vector
    // etc.
public:
    ArrayBinaryTree(DataType info);
    virtual ~ArrayBinaryTree();
}

构造函数可以实现,例如像这样(假设它初始化根节点):

ArrayBinaryTree(DataType info) {
    theBinaryTree.push_back(ArrayNode<DataType>(info, -1, -1));
    _root = 0;
}

甚至更好,您可以使用初始化列表:

 ArrayBinaryTree(DataType info)
       : theBinaryTree( { ArrayNode<DataType>(info, -1, -1) } ),
         _root(0) {}

我不知道你是否必须通过矢量实现它,或者它是否只是你的设计选择。如果这只是您的设计选择,我建议您重新设计它。假设这个简化的界面:

template< typename T >
struct Node {
    T _value;
    std::unique_ptr<Node> _left;
    std::unique_ptr<Node> _right;

    Node(const T& val) : _value(val) {}
};

template < typename T >
class BinTree {
    std::unique_ptr<Node<T>> _root;
public:
    // methods
};

我发现这种设计对于像树这样的结构来说要好得多。如果你有兴趣,我可以多写一点。 注意:std :: unique_ptr是在c ++ 11中引入的,所以如果你用较旧的标准写入原始指针就必须这样做(=更多的工作)。