【问题标题】:Calculating depth of a node of a tree with certain constraints in C++在 C++ 中计算具有某些约束的树的节点的深度
【发布时间】:2013-11-12 00:04:47
【问题描述】:

我有一棵树,其中有 3 个级别。有一个根节点,根节点有3个叶子节点,所有3个叶子节点都有3个其他叶子节点。节点代表服务器。现在,我必须计算给定级别的节点深度。深度计算如下:

1) 如果服务器(节点)在任何级别和任何列“向上”,则该节点的深度为 0。

2) 如果服务器处于最后一层并且“关闭”,则该节点的深度为无穷大。

3) 对于所有其他情况,节点的深度是其叶节点的最大深度 + 1。最大深度表示其子节点中出现的多数值。

这里采用自下而上的方法,因此,根节点的深度是级别 1 的深度。级别作为程序中的输入参数。现在,我必须计算根节点的深度。

我对程序做了一些假设:

1) 查找子节点,跟随父节点的子指针。

2) 要查找给定级别中的所有节点,请从根遍历子节点直到到达该级别并列出它们。

3) 根据给定的约束分配值。

我不确定我的方法是否正确。请帮帮我。谢谢。

【问题讨论】:

  • 我假设第一个约束,你的意思是“如果服务器在最后一级并且已经启动”,对吗?
  • 不,对于第一个约束,无论服务器在什么级别,如果它是up,则该节点的深度为0。例如,如果该节点在级别2和列4 如果它是向上的,那么该节点的深度是 0。我编辑了这个问题。
  • 我很难完全理解您在这里尝试解决的问题。您能否提供更多有关该问题的背景信息。另外,如果任何节点“关闭”,那么根节点的深度会不会是infinity
  • 我明白你的意思。最大(叶节点)是指大多数叶节点所具有的值。例如,如果有一个节点有 3 个叶节点,其值为 infinity, 1, 1。那么该节点的最大深度将为 1,因为它的两个叶节点的值为 1。然而,可能存在以下情况:根节点的值为无穷大。那样的话,整个网络都是失败的。
  • 也许您最好尝试解释算法的更高级别目标,而不是您构建的约束。例如,我怀疑您想要“min”而不是“max”,问题是要找到“从根到未关闭的节点的最小距离”。

标签: c++


【解决方案1】:

我认为您需要类似于以下伪代码的内容:

int nodeStatus(const Node& n) {
    int status = 0;
    if (n.isUp)
        return 1;
    else if (n.isLeaf)
        return -1;
    else {
        for (Node child : n.children) 
            status += nodeStatus(child);
    }
    if (status > 0)
        return 1;
    else
        return -1;
}

这是一种递归方法。它首先检查节点是否启动,在这种情况下它返回 1。然后如果节点关闭并且是叶子,它返回 -1,因为这是没有子节点的故障。最后,如果n 是一个中间节点,那么它会为所有子节点再次递​​归调用此方法,并对结果求和。最后的if 语句然后测试大多数孩子是否被归类为1 或-1 并相应地返回值。请注意,通过使用值 1-1 可以将子节点相加并提供每个节点肯定有 3(或奇数个)节点,那么永远不会出现 status == 0 的情况将是没有多数情况的情况。

您需要在某个地方定义一个名为 Nodestruct,如下所示:

struct Node {
    Node(bool isUp, bool isLeaf);
    bool isUp;
    bool isLeaf;
    std::Vector<Node> children = new std::Vector<Node>(3);
}

我希望这能回答你的问题,但可能是我解释错了。

【讨论】:

  • 非常感谢您的代码。我有几件事要补充。另外,我有几个问题。首先,如果一个节点启动,那么它总是返回 0。“然后,如果节点关闭并且是叶子,它返回 -1,因为这是一个没有子节点的失败。”。这是对的。我的问题是我们从哪里获得子节点的大部分值?我们不想总结子节点的值,我们只想取大部分值。该值加上 1,将构成父节点的深度。
  • 另外,我需要将级别作为输入参数。 level 是一个整数值,因此在运行程序时,如果我给 2 作为 level,那么程序将返回 level 2 的节点的深度。
  • 启动的节点是否需要值为 0,或者这是您做出的任意设计选择?使用 1 而不是 0 的原因是为了与故障节点的 -1 对称。这样,当我们将三个孩子相加得到 status 时,它由三叉树的集合 {-3, -1, 1, 3} 定义,最后的 if \ else 语句测试 0 status 的哪一侧打开并返回 1-1 相应地,因此获得了孩子的多数(模态)值。
  • 我很难理解depth 的意思。您声明您希望节点的深度为1 + majority(children),如果它失败并且有子节点,否则为0。这意味着中间层或我们的三层树中的节点可以具有1 的值。那么在计算其父母的深度时应该使用这个值吗? IE。在第 2 层的 3 个节点中的 2 个节点失败但深度为 1 的情况下,root 节点的深度是否可以为 2?我认为你需要更好地定义深度,更多的问题背景会有所帮助。
  • 我认为到目前为止,您的代码在这种情况下是可以的。我将尝试进一步使用此代码。
猜你喜欢
  • 2021-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-28
  • 1970-01-01
  • 2014-11-23
  • 1970-01-01
  • 2021-10-10
相关资源
最近更新 更多