Algorithm 在二叉树中查找最深的节点而不使用额外的类?

Algorithm 在二叉树中查找最深的节点而不使用额外的类?,algorithm,data-structures,binary-tree,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

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

我找到的每一个解决方案都是这样的:

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

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

一个包含两个节点公共字段的类和深度是最类似Java的方法。备选方案包括:

  • 具有两个元素(用于节点和深度)的
    对象[]
    ,以及
  • 一种
    HashMap
    ,其中第一个条目具有键
    “node”
    ,其值为节点,第二个条目具有键
    “depth”
    ,其值为表示深度的整数

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

一个节点有两个公共字段的类,深度是最像Java的方式。备选方案包括:

  • 具有两个元素(用于节点和深度)的
    对象[]
    ,以及
  • 一种
    HashMap
    ,其中第一个条目具有键
    “node”
    ,其值为节点,第二个条目具有键
    “depth”
    ,其值为表示深度的整数

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

在更新我之前的答案时,发现您可以一次完成这项工作。无论何时找到没有子节点的节点,当当前深度超过目前找到的最大深度时,请保留指向该节点的指针

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

在更新我以前的答案时,结果证明你可以一次完成。无论何时找到没有子节点的节点,当当前深度超过目前找到的最大深度时,请保留指向该节点的指针

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

您可以返回最后一级上的任何节点,还是仅返回最右边的节点?@0x499602D2未指定,因此可以返回任意一个。您可以返回最后一级上的任何节点,还是仅返回最右边的节点?@0x499602D2未指定,因此可以返回任意一个。