【发布时间】:2019-08-17 19:40:49
【问题描述】:
我是理解和学习数据结构的新手。在搜索了一些教程后,我尝试实现 Tree 数据结构。看起来不错,但我不明白这里有点奇怪的递归行为。可以有人帮助我理解代码。
我包含了一些打印语句来理解递归流程,但无法理解为什么没有返回当前引用?
public class TreeCheck {
Node root;
private Node addRecursive(Node current, int value) {
if (current == null) {
return new Node(value);
}
if (value < current.value) {
current.left = addRecursive(current.left, value);
} else if (value > current.value) {
current.right = addRecursive(current.right, value);
} else {
// value already exists
return current;
}
System.out.println("current is "+current.value); //Please compare in the
image why the
return current;
}
public void add(int value) {
root = addRecursive(root, value);
System.out.println("value is "+root.value);
}
public static void main(String h[]){
TreeCheck bt = new TreeCheck();
bt.add(6);
bt.add(4);
bt.add(8);
bt.add(3);
bt.add(5);
bt.add(7);
bt.add(9);
}
class Node {
int value;
Node left;
Node right;
Node(int value) {
this.value = value;
right = null;
left = null;
}
}
为什么当前语句被打印两次,并且总是在有时重新分配当前语句时才返回根元素?
【问题讨论】:
-
您首先进行递归调用。这个递归调用可能会进行另一个递归调用。您的日志仅在所有递归完成后打印。为了更好地理解它,请尝试添加两个日志。首先在你的 addRecursive 方法的开头,比如
println("START: current is" + ...),当前日志是println("END: current is" + ...)。甚至可能在您的 if 语句中添加更多日志,以清楚地查看它是添加到树的左侧还是右侧。更好的方法是拿起笔和纸一步一步地画树,看看它是如何创建的。 -
@ich5003 谢谢,在上面的例子中,查询是在添加 4 时,当前节点(最初是 6)但由于递归它变成了 4 并且它没有返回,而不是那个 6再次返回。为什么会出现这种行为?为什么递归函数返回语句被忽略?
-
"current" 并不总是您要添加的值。清楚地看看递归调用会发生什么。您将函数参数 current 设置为 current.left 或 current.right。因此,您正在逐个节点地遍历树,直到找到一个不再存在节点的位置,然后您将在那里添加您的值。确保您了解作为函数参数的“当前”和“值”之间的区别。