在没有额外的类的情况下在二叉树中找到最深节点?

时间:2018-10-08 01:58:34

标签: algorithm data-structures binary-tree

我遇到了这个问题,目的是找到二叉树中最深的叶子节点。

我发现的每个解决方案都可以执行以下操作:

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)
    {
        ...
    }
}

还有其他方法不需要声明新类来避免返回多个值的问题吗?

2 个答案:

答案 0 :(得分:1)

一个具有两个公共节点和深度的类是最类似于Java的处理方式。替代方法包括:

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

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

答案 1 :(得分:1)

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

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;
}