我遇到了这个问题,目的是找到二叉树中最深的叶子节点。
我发现的每个解决方案都可以执行以下操作:
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)
{
...
}
}
还有其他方法不需要声明新类来避免返回多个值的问题吗?
答案 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;
}