二叉树的前中后序非递归遍历算法

学过数据结构的同学都知道二叉树的深度优先遍历算法有三种,前序,中序,后序遍历。

前序:根–>左–>右

中序:左–>根–>右

后序:左–>右–>根

不难发现,后序遍历和前序遍历有相似的地方,如果我们将后序遍历变成根右左的顺序,将结果集翻转后就会变成前序的根左右顺序。

前中后序非递归遍历的核心算法:

前序遍历:
1
2
3
4
5
6
7
8
9
10
11
12
while(root != null || !stack.isEmpty()){
// 一直往左边走
while(root != null){
res.add(root.val);
stack.push(root);
root = root.left;
}
// 开始回退
TreeNode cur = stack.pop();
// 往右边走
root = cur.right;
}
后序遍历:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
while(root != null || !stack.isEmpty()){
// 一直往右边走
while(root != null){
res.add(root.val);
stack.push(root);
root = root.right;
}
// 开始回退
TreeNode cur = stack.pop();
// 往左边走
root = cur.left;

// 反转,使变成后序遍历
Collections.reverse(res);
}
中序遍历:
1
2
3
4
5
6
7
8
9
10
11
12
13
while(root != null || !stack.isEmpty()){
// 碰到根节点,压栈
while(root != null){
stack.push(root);
// 往左边走
root = root.left;
}
// 开始回退
root = stack.pop();
res.add(root.val);
// 往右边走
root = root.right;
}

前中后序递归遍历的核心算法:

前序遍历:
1
2
3
4
5
6
7
public void dfs(TreeNode root){
while(root != null){
res.add(root.val);
dfs(root.left);
dfs(root.right);
}
}
中序遍历:
1
2
3
4
5
6
7
public void dfs(TreeNode root){
while(root != null){
dfs(root.left);
res.add(root.val);
dfs(root.right);
}
}
后序遍历:
1
2
3
4
5
6
7
public void dfs(TreeNode root){
while(root != null){
dfs(root.left);
dfs(root.right);
res.add(root.val);
}
}

评论