我试图用preordertraverse编写一个toString方法。这是两个功能。在preOrderTraverse中,当我写++深度和深度+ 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
为什么会这样?
答案 0 :(得分:2)
在
preOrderTraverse(node.left,depth + 1, sb);
preOrderTraverse(node.right,depth + 1,sb);
两个递归调用都获得第二个参数的相同值,因为depth + 1
不会更改局部变量depth
的值。
在
preOrderTraverse(node.left,++depth, sb);
preOrderTraverse(node.right,++depth,sb);
第二次递归调用传递的值比传递给第一次调用的值大1,因为++depth
会增加局部变量depth
的值。
前者似乎是正确的方式。
答案 1 :(得分:2)
++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解释器遵循从左到右的规则进行函数参数评估)