以前只会二叉树的一种非递归遍历,最近又看了二叉树的多种非递归遍历方式,感觉很有用,亲自实现用理解了一番,总结如下。
一、常用方式
1、先序遍历
1.1 自己常用的一种方式:
public List<Integer> preOrder1(TreeNode root) {
List<Integer> list = new ArrayList<>();
Stack<TreeNode> stack = new Stack<>();
stack.push(root);
TreeNode node = null;
while (!stack.isEmpty()) {
node = stack.pop();
if (node != null) {
list.add(node.value);
stack.push(node.right);
stack.push(node.left);
}
}
return list;
}
public List<Integer> preOrder2(TreeNode root) {
List<Integer> list = new ArrayList<>();
Stack<TreeNode> stack = new Stack<>();
TreeNode node = root;
while (!stack.isEmpty() || node !=null) {
if(node != null){
list.add(node.value);
stack.push(node);
node = node.left;
} else {
node = stack.pop();
node = node.right;
}
}
return list;
}
2、中序遍历
public List<Integer> inOrder1(TreeNode root) {
List<Integer> list = new ArrayList<>();
Stack<TreeNode> stack = new Stack<>();
TreeNode node = root;
while (!stack.isEmpty() || node !=null) {
if(node != null){
stack.push(node);
node = node.left;
} else {
node = stack.pop();
list.add(node.value);
node = node.right;
}
}
return list;
}
3、后序遍历
public List<Integer> postOrder(Node root) {
List<Integer> res = new ArrayList<>();
Stack<Node> stack = new Stack<>();
stack.push(root);
Node node = null;
Node pre = null; //访问的前一个元素
while(!stack.isEmpty()) {
node = stack.peek();
if(node != null) {
if(node.left != null && node.left != pre && node.right != pre) {
stack.push(node.left);
} else if(node.right != null && node.right != pre) {
stack.push(node.right);
} else {
res.add(node.value);
pre = stack.pop(); //此时 node = stack.pop();
}
}
}
return res;
}