【问题标题】:Find Deepest Node in Binary Tree without extra class?在没有额外课程的情况下找到二叉树中最深的节点?
【发布时间】:2018-10-08 18:18:57
【问题描述】:

我遇到了在二叉树中找到最深叶节点的问题。

我发现的每一个解决方案都是这样的:

private class DepthNode
{
    int depth;
    Node n;
}

public class BinaryTree
{
    ...

    public Node deepestNode()
    {
        return deepestNode(root, 0).n;
    }

    private DepthNode deepestNode(Node node, int depth)
    {
        ...
    }
}

有没有其他方法不需要声明一个新类来规避返回多个值的问题?

【问题讨论】:

  • 你能返回最后一层的任何节点还是只返回最右边的节点?
  • @0x499602D2 未指定,所以任一个。

标签: algorithm data-structures binary-tree


【解决方案1】:

具有节点和深度的两个公共字段的类是最类似于 Java 的做事方式。替代方案包括:

  • Object[] 有两个元素(用于节点和深度),并且
  • 一个HashMap<String, Object>,其中第一个条目的键为"node",其值为节点,第二个条目的键为"depth",其值为代表深度的Integer

对于 Java,一个单独的类是最惯用的。其他方式没有类,但对于 Java 来说看起来有点奇怪。例如,Python 和 JavaScript 不需要额外的类;我猜大多数语言也没有。 Java 只是非常坚持名称和类。

【讨论】:

    【解决方案2】:

    在更新我之前的答案时,事实证明您可以一次性完成此操作。每当你找到一个没有子节点的节点时,当当前深度超过目前找到的最大深度时,保留一个指向它的指针。

    Node deepest_node = null;
    
    void deepestNodeImpl(Node root, int max_depth, int cur_depth) {
      if (!root) return;
      if (!root.left && !root.right) {
        if (cur_depth > max_depth) {
          deepest_node = root;
          max_depth = cur_depth;
        }
        return;
      }
      deepestNodeImpl(root.left, max_depth, cur_depth + 1);
      deepestNodeImpl(root.right, max_depth, cur_depth + 1);
    }
    
    Node deepestNode(Node root) {
      deepestNodeImpl(root, -1, 0);
      return deepest_node;
    }
    

    【讨论】:

      猜你喜欢
      • 2019-04-16
      • 1970-01-01
      • 1970-01-01
      • 2015-09-15
      • 2021-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-08
      相关资源
      最近更新 更多