二叉树的三种迭代遍历
二叉树的三种遍历方式分别是前序、后序、中序。其递归方式比较简单,此处用栈模拟递归来描述二叉树的三种遍历方式的迭代版本
1、前序遍历
先到最左边节点,一路上收集左节点到栈中,并保存到结果集。
之后不断出栈,并对出栈结果的右节点进行如上操作
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> ans = new ArrayList<>();
if(root == null) return ans;
TreeNode cur = root;
Deque<TreeNode> stack = new LinkedList<>();
while(!stack.isEmpty() || cur != null) {
while(cur != null) {
stack.push(cur);
ans.add(cur.val);
cur = cur.left;
}
cur = stack.pop().right;
}
return ans;
}
}
2、中序遍历
和前序遍历基本一致,所不同的是在中序中要求的结果是:左中右,所以在保存结果集的时候只能是在回来的路上保存
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> ans = new ArrayList<>();
if(root == null) return ans;
Deque<TreeNode> stack = new LinkedList<>();
TreeNode cur = root;
while(!stack.isEmpty() || cur != null) {
while(cur != null) {
stack.push(cur);
cur = cur.left;
}
TreeNode node = stack.pop();
ans.add(node.val);
cur = node.right;
}
return ans;
}
}
3、后序遍历
后序遍历的方式是:左 右 根,此处我们如果反过来就是:根 右 左
我们发现,这其实是一种反方向的前序遍历,只需要将前序遍历的左右调换位置即可得到根右左,最后将得到的结果反转即可
class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
// 转化为前序遍历反转即可
List<Integer> ans = new ArrayList<>();
if(root == null) return ans;
TreeNode cur = root;
Deque<TreeNode> stack = new LinkedList<>();
while(!stack.isEmpty() || cur != null) {
while(cur != null) {
ans.add(cur.val);
stack.push(cur);
cur = cur.right;
}
cur = stack.pop().left;
}
Collections.reverse(ans);
return ans;
}
}