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未指定,因此可以返回任意一个。