我试图用 preordertraverse 编写一个 toString 方法。这里有两个函数。在 preOrderTraverse 中,当我写++depth 和 depth + 1 时有两个不同的输出。
public String toString()
{
StringBuilder sb = new StringBuilder();
preOrderTraverse(root, 1, sb);
return sb.toString();
}
private void preOrderTraverse(Node<E> node, int depth, StringBuilder sb)
{
for(int i = 1; i < depth; ++i)
sb.append(" ");
if(node == null)
sb.append("null\n");
else
{
sb.append(node.toString());
sb.append("\n");
preOrderTraverse(node.left,depth + 1, sb);
preOrderTraverse(node.right,depth + 1,sb);
}
}
这给了我这个
50
30
null
null
70
null
null
如果我写这个
preOrderTraverse(node.left,++depth, sb);
preOrderTraverse(node.right,++depth,sb);
我明白了
50
30
null
null
70
null
null
为什么会这样?
最佳答案
++depth
在增加值 后返回值。如果您有两个增加值的命令,那么该值将在这两个命令之间发生变化。
preOrderTraverse(node.left, ++depth, sb);
preOrderTraverse(node.right, ++depth, sb);
大致等同于*:
depth = depth + 1;
preOrderTraverse(node.left, depth, sb);
depth = depth + 1;
preOrderTraverse(node.right, depth, sb);
* 它并不完全等同,至少因为操作是在 node.left
之后和 sb
之前评估的(假设 Java 解释器遵循从左到- 函数参数评估的正确规则)。
关于java -++i 和 i = 1 在递归函数中的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43704674/