二叉树三种遍历的非递归形式
前序遍历非递归算法
public void preOrderNonRecursion(BinaryTreeNode<T> root){ // 非递归前序遍历
LLStack<BinaryTreeNode<T>> stack = new LLStack<>();
while(true){
while(root != null){
System.out.println(root.getData());
stack.push(root);
root = root.getLeft();
}
if(stack.isEmpty())
break;
root = stack.pop().getRight();
}
}
中序遍历非递归算法
public void inOrderNonRecursion(BinaryTreeNode<T> root){ // 非递归中序遍历
LLStack<BinaryTreeNode<T>> stack = new LLStack<>();
while(true){
while(root != null){
stack.push(root);
root = root.getLeft();
}
if(stack.isEmpty())
break;
root = stack.pop();
System.out.println(root.getData());
root = root.getRight();
}
}
前序遍历和中序遍历的非递归很相似,只是输出的位置不一样而已,下面的后续遍历非递归有点难理解,不过感觉比数据结构课上学的简单。这是自己根据一本书上的改的:
后续遍历非递归算法
public void postOrderNonRecursion(BinaryTreeNode<T> root){ // 后序遍历非递归算法
LLStack<BinaryTreeNode<T>> stack = new LLStack<>();
while(true){
if(root != null){
stack.push(root);
root = root.getLeft();
} else {
while(!stack.isEmpty() && root == stack.getTop().getRight()){ // 判断右子树是否遍历完成
root = stack.pop();
System.out.println(root.getData());
}
// 判断上述while循环退出的原因
if(stack.isEmpty()) // 如果是因为栈为空,退出外层循环
break;
else // 如果是因为右子树未遍历完,将右子树作为根结点循环
root = stack.getTop().getRight();
}
}
}
我构造了如下二叉树来验证:
得到的结果:
当然,不排除有其他特例,如有错误,欢迎指正。
完整代码可以访问我的GitHub:https://github.com/StriverLi/Data-Structures-and-Algorithms-in-Java/blob/master/src/tree/BinaryTreeNode.java

浙公网安备 33010602011771号