二叉树的前中后序非递归遍历算法
学过数据结构的同学都知道二叉树的深度优先遍历算法有三种,前序,中序,后序遍历。
前序:根–>左–>右
中序:左–>根–>右
后序:左–>右–>根
不难发现,后序遍历和前序遍历有相似的地方,如果我们将后序遍历变成根右左的顺序,将结果集翻转后就会变成前序的根左右顺序。
前中后序非递归遍历的核心算法:
前序遍历:
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); } }
|