如何解决BST 的 InOrder 遍历...为什么循环条件是“cur != null || !stack.empty()”?”
这是 BST 的 InOrder 遍历(左、根、右):
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<Integer>();
Stack<TreeNode> stack = new Stack<TreeNode>();
TreeNode cur = root;
while(cur!=null || !stack.empty()){
while(cur!=null){
stack.add(cur);
cur = cur.left;
}
cur = stack.pop();
list.add(cur.val);
cur = cur.right;
}
return list;
}
我无法理解为什么 'while' 循环条件是 cur != null || !stack.empty().
我尤其对“cur != null”感到困惑。 为什么这甚至是必要的?
从“或”语句的逻辑,A || B 表示 A 和 B 都必须为假,循环才能中断。
所以一旦 cur == null 并且堆栈为空,循环就会中断。
为什么我们甚至需要关心 cur == null ?这不是无关紧要和不必要的吗?
注意:原始 LC 问题(用于测试)--https://leetcode.com/problems/binary-tree-inorder-traversal/
解决方法
如果只在栈不为空的情况下继续循环,则循环根本不会开始,因为栈是空的。
即使使用 do...while 循环,“栈不为空”的条件也是不够的。
考虑一棵没有左节点的树:
root
\
\
node1
\
\
node2
该算法会将 root
添加到堆栈中,然后弹出它,然后将其添加到列表中。之后,curr
将成为root
的右节点,即node1
。此时栈为空,但curr
不为空。
循环会在此时停止,这显然是不正确的。
while 循环应该只在堆栈为空并且没有正确节点时才停止(即,如果堆栈为空或有正确节点,则继续)。
,如果没有 cur!=null
检查,如果您调用 inorderTraversal(null);
,它会抛出 EmptyStackException
。
如果您在 Eclipse 等任何 IDE 中运行它,您可以使用调试功能。
或者手动尝试执行简单输入[1,null,2]
。
第一次迭代后,堆栈将为空,但 curr
不会为空。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。