【发布时间】:2021-08-24 08:19:01
【问题描述】:
我已经用 C++ 实现了一个简单的二叉树类。 使用智能指针对象来保存指向每个节点的指针(子节点共享,父节点弱)。
我试图为自定义迭代器(按顺序、预排序和后排序)实现一个嵌套类,但我不知道如何有效地实现 .next() 方法。 如何在不将整个树保留在优先级队列中的情况下获取当前位置。
树节点是一个结构 -
struct node : std::enable_shared_from_this
{
T _val;
std::weak_ptr<node> _parent;
std::shared_ptr<node> _leftChild;
std::shared_ptr<node> _rightChild;
// CONSTRUCTORS
node(T val): _val(val){}
node(T val, weak_ptr<node> parent): _val(val), _parent(parent){}
};
【问题讨论】:
-
什么是.next()?为什么不递归地实现有序、前序和后序?
-
你真的需要迭代器吗? (模板)函数成员
in_order_traversal(std::function<void(T&)>)怎么样? -
那么您要问的是如何根据其中一个命令确定下一个节点。问题是什么?查看您刚刚遍历过的树中的一个节点,是什么让您无法识别下一个节点?队列在哪里进入游戏?请解释你的理由。考虑使用 ascii-art 树形图来可视化您的问题和遇到的具体问题。我问是因为我觉得父指针的存在(即与标准二叉树的区别)使事情变得非常容易。
-
进行(按顺序)遍历与为该遍历提供 iterator 之间存在差异。 (由于递归,前者很简单,后者更复杂)。
标签: c++ binary-tree smart-pointers traversal