我正在使用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
。设置构造函数以进行访问的更好方法是什么?
答案 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中引入的,所以如果你用较旧的标准写入原始指针就必须这样做(=更多的工作)。