假设我们有一个RedBlack-Tree实现,它由2个类组成:
Tree
- 保存指向树Node *root
的指针,并定义树上的所有操作(Insert
,Delete
等)Node
- 一个数据存储,包含指向Node *parent
,Node *left
,Node *right
节点和std::string key
的指针。 Tree::Insert()
具有以下实现:
void Tree::Insert(const std::string &key)
{
Node *z = new Node(key);
// adding node logic
}
现在任务:每个节点都必须存储其创建时间。
限制:应尽可能少地修改基础树实现,并应包含特定扩展的详细信息(因此它应该对创建时间属性一无所知)。
我的想法:扩展NodeWithTime : Node
并添加unsigned int creation_time
属性。
我陷入困境:我们现在如何实例化节点?
任何提案?
PS:它既不是家庭作业也不是工作任务 - 我只是学习c ++和数据结构。答案 0 :(得分:1)
这相对简单。首先,节点结构:
template<typename T> struct Node {
Node(T t) : value(std::move(t)), time(RightNow()) {}
T value;
TimeType time;
std::unique_ptr<Node> left;
std::unique_ptr<Node> right;
};
快速帮助make_unique
:
template<typename T, typename... Args> std::unique_ptr<T> make_unique(Args&&... args) {
return std::unique_ptr<T>(new T(std::forward<Args>(args...)));
}
template<typename T> void Tree<T>::Insert(T key) {
auto z = make_unique<Node<T>>(std::move(key));
// insert
}
首先,我修复了你的蹩脚new
和delete
并用智能指针替换它。然后我也让你的树成为模板,因为谁需要一棵只能做一种类型的树呢?然后我用const T&
换了你的T
,以便它可能只使用移动类型。
然后我刚刚在构造函数中添加了一个Time字段并调用了RightNow()。您使用的确切TimeType和RightNow()取决于您的需求以及“创建时间”的具体含义。我们在谈论“2013年7月6日”吗?还是一个非常高分辨率的时钟?无论如何,这些“创建时间”细节不会影响树。
编辑:等等,您想拥有一种树类型,其中只有部分节点知道创建时间?或者只是改变树,以便所有节点知道创建时间?我做了#2,但对于#1,你确实可以简单地从Node继承。好的,
template<typename T> struct Node {
Node(T t) : value(std::move(t)) {}
T value;
std::unique_ptr<Node> left;
std::unique_ptr<Node> right;
};
template<typename T> struct NodeWithTime : Node<T> {
TimeType time;
NodeWithTime(T t) : Node(std::move(t)), time(RightNow()) {}
};
template<typename T> void Tree<T>::insert(T t) {
std::unique_ptr<Node> nodeptr;
if (IWantToStoreCreationTime)
nodeptr = make_unique<NodeWithTime<T>>(std::move(t));
else
nodeptr = make_unique<Node>(std::move(t));
// insert
}