用独特的指针将节点添加到树上



我对聪明的指针非常陌生,我试图创建一棵双重的树,在这里,一个独特的指针从父母那里指向父母,孩子们通过原始指针。因此,当父节点被破坏时,整个子树将在此过程中被销毁。

class Node {
private:
    Node *parent;
    std::unique_ptr<Node> left;
    std::unique_ptr<Node> right;
public:
    Node(Node* _left, Node* _right, Node* _parent);
};
Node::Node(Node* _left, Node* _right, Node* _parent) {
    parent = &_parent;
    //this is where the problem starts
}

我不明白如何指向一个可能要连接的树的新节点。如果我使用make_unique,我相信这将创建一个新的节点,而不是保留树。

我可能对此完全错误

首先,一个空的树是可能的,默认的构造节点非常适合。在附加节点时,将知道父母的参考,因此,一旦将节点设置为当前树的左或右子,则应更新子女的节点父。

当您拥有收到的指针的所有权时,最好接收唯一的_ptr。这是一个示例实现:

class Node {
private:
  Node *parent = nullptr;
  std::unique_ptr<Node> m_left;
  std::unique_ptr<Node> m_right;
public:
  void left(std::unique_ptr<Node> child) {
    m_left = std::move(child);
    m_left->parent = this;
  }
  void right(std::unique_ptr<Node> child) {
    m_right = std::move(child);
    m_right->parent = this;
  }
};

您将像以下内容一样使用它:

int main()
{
  auto tree = std::make_unique<Node>();
  auto subtree = std::make_unique<Node>();
  subtree->right(std::make_unique<Node>());
  tree->right(std::make_unique<Node>());
  tree->left(std::move(subtree));
  return 0;
}

我自己是unique_ptr的新手,希望有人能进一步纠正我。顺便说一句,不要使用以 _开头的名称帽子,以确定您的标识。

我认为您无法使用:

Node(Node _left, Node _right, Node _parent);

这将不允许通过节点构建树节点。而是使用:

Node(Node* _left, Node* _right, Node* _parent);

这样,您可以使用:

创建第一个节点
Node firstNode(nullptr, nullptr, nullptr);

从那里,您可以构建其他节点。

构建一个简单的树,带有下面的三个节点

            N1
           /  
         N2    N3

您可以使用:

Node* N1 = new Node(nullptr, nullptr, nullptr);
Node* N2 = new Node(nullptr, nullptr, N1);
Node* N3 = new Node(nullptr, nullptr, N1);
N1->left = N2;  // Use the equivalent member function.
N1->right = N3;

我相信您想让父母,左右子公开。至少,这就是我一直使用struct实现节点的方式:

struct Node
{
    Node(std::unique_ptr<Node> _parent = nullptr, 
std::unique_ptr<Node> _left = nullptr, std::unique_ptr<Node> _right = nullptr) : parent(_parent), left(_left), right(_right) {}
    std::unique_ptr<Node> parent;
    std::unique_ptr<Node> left;
    std::unique_ptr<Node> right;
};

有人如果我错了,请纠正我。

相关内容

  • 没有找到相关文章

最新更新