【问题标题】:Tree Traversals with smart pointers带智能指针的树遍历
【发布时间】: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&lt;void(T&amp;)&gt;)怎么样?
  • 那么您要问的是如何根据其中一个命令确定下一个节点。问题是什么?查看您刚刚遍历过的树中的一个节点,是什么让您无法识别下一个节点?队列在哪里进入游戏?请解释你的理由。考虑使用 ascii-art 树形图来可视化您的问题和遇到的具体问题。我问是因为我觉得父指针的存在(即与标准二叉树的区别)使事情变得非常容易。
  • 进行(按顺序)遍历与为该遍历提供 iterator 之间存在差异。 (由于递归,前者很简单,后者更复杂)。

标签: c++ binary-tree smart-pointers traversal


【解决方案1】:

您需要知道每个节点是哪个子节点,然后您可以从中派生出结构中的下一个节点。你可以用指针相等来做到这一点

struct iter_base {
    std::shared_ptr<node> current;
    bool isRoot() const { return !current->_parent.lock(); }
    bool isLeft() const { auto parent = current->_parent.lock(); return parent && (current == parent->_leftChild); }
    bool isRight() const { auto parent = current->_parent.lock(); return parent && (current == parent->_rightChild); }
};

例如为了有序:

  • 如果您有一个右子节点,请跟随该节点的左后代,直到没有更多节点,最后一个是下一个节点。
  • 否则,如果您是左孩子,则下一个节点是您的父母。
  • 否则,如果您是右孩子,请跟随父指针,直到找到一个左孩子,并且下一个节点是该左孩子的父节点。如果你这样做,你就已经走到了尽头。

【讨论】:

  • 这就是我的意思。我只是怀疑OP忘了提到一个障碍......
  • 正如 Yunnosch 所建议的那样,我想我的问题还不够清楚。我确实试图在不持有节点数据结构的情况下进行遍历。谢谢。这真的很有帮助。
猜你喜欢
  • 2012-08-21
  • 2020-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-08
相关资源
最近更新 更多