在使用栈来实现二叉树的中序遍历时,对于判断当前结点为空时使用 while 和 if 的结果不一样
//中序遍历 左根右
public String inOrder(){
ArrayList<E> list = new ArrayList<>();
inOrder(root,list);
return list.toString();
}
private void inOrder(Node root, ArrayList<E> list) {
LinkedList<Node> stack = new LinkedList<>();
Node mid = root;
//标记遍历结点不为null 或者 栈不为空
while(mid != null || !stack.isEmpty()){
//这里使用 if 的话只会出现左子树的左节点
//用while 的话能如期显示
while (mid != null){ //把mid的左序列结点,全部压栈
stack.push(mid);
mid = mid.left;
}
//出栈遍历
Node pop = stack.pop();
list.add(pop.value);
//这里可以不用判断
//直接写 mid = pop.right;
if (pop.right != null){
mid = pop.right;
}
}
}
原因分析:
while和if一个是循环语句,一个是判断语句。
if 只做判断,判断一次之后,便不会再回来了
while 的话,循环,直到结果为false,才跳出来
链表的结构,要一直读下去,直到读完整个链表结构,所以需要while
if的话只读一次,便跳出了
if 和 while当条件不成立时,都跳过代码块执行后面的代码。
不同的是当条件成立时,if执行完代码块后继续执行后面的代码,while执行完代码块后再判断while的条件,成立就再执行代码块里的代码,直到不成立,才执行代码块后面的代码。while的代码块里如果遇到break;指令,则跳出while代码块直接执行后面的代码。