前言
本文主要将前序遍历、中序遍历、后序遍历的非递归方法。
递归方法和层序遍历请看 递归前序遍历、递归中序遍历、递归后序遍历、层序遍历和判断一棵树是否为完全二叉树
非递归前序遍历二叉树
第一种方法:
利用栈实现
1.设置 node = root
2.循环执行以下操作
- 如果 node != null ,对 node 进行访问,将 node.right入栈,设置 node = node.left
- 如果 node == null,如果栈为空,结束遍历;如果栈不为空,弹出栈顶元素并赋值给 node
代码:
/*
* 非递归前序遍历
* */
public void preorder1(Visitor<E> visitor){
if (root == null || visitor == null) return;
Node<E> node = root;
Stack<Node<E>> stack = new Stack<>();
while(true){
if (node != null){
//访问 node 节点
if (visitor.visit(node.element)) return;
//将右子节点入栈
if (node.right != null){
stack.push(node.right);
}
//向左走
node = node.left;
}else if (stack.isEmpty()){
return;
}else {
//处理右边
node = stack.pop();
}
}
}
public static interface Visitor<E>{
boolean visit(E element);
}
第二种方法:
利用栈实现
1.将 root 入栈
2.循环执行以下操作,直到栈为空
- 弹出栈顶节点top,进行访问
- 将top.right入栈
- 将top.left入栈
代码:
public void preorder2(Visitor<E> visitor){
if (root == null || visitor == null) return;
Stack<Node<E>> stack = new Stack<>