二叉树迭代前序遍历为何用top.state++而非state++
核心原因是Java的基本类型赋值是值拷贝,修改局部变量不会影响原对象的属性
- 你代码里
int state = top.state这行,是把栈中Pair实例的state属性的值拷贝一份给到局部变量state,两个变量存储在完全独立的内存空间,没有关联。 - 你写
state++只是修改了当前栈帧里的临时局部变量的值,根本不会更新栈中存储的Pair对象的state属性。下次循环再取同一个top节点的state时,拿到的还是原来的旧值。 - 而
top.state++是直接修改栈中Pair实例的成员属性,修改结果会持久存在这个对象上,下次处理同一个节点时就能读到更新后的状态,符合你模拟递归栈的迭代遍历逻辑。
改成state++后的错误表现
当你用state++时,处理同一个节点时每次读到的state永远是初始值1:
- 第一次处理节点,走
state==1分支加节点值到结果,局部state加1,但栈里Pair的state还是1 - 等左子树全部处理完成弹栈后,回到当前节点,读到的
state还是1,会重复把节点值加入结果,再次压入左子树,最终要么出现死循环,要么结果里有大量重复值,完全不符合前序遍历要求。
简单验证逻辑
你可以运行这段demo直观看到区别:
class Test { int state = 1; public static void main(String[] args) { Test obj = new Test(); int state = obj.state; state++; System.out.println(obj.state); // 输出还是1,局部变量修改不影响原对象属性 obj.state++; System.out.println(obj.state); // 输出2,直接修改对象属性才会生效 } }
内容的提问来源于stack exchange,提问作者andrew
相关产品推荐
相关产品推荐

