前言
作为前端,对于算法的知识应该有一定的了解。
理解本文,需要对二叉树及其算法有一些基本的了解,本文主要讲解二叉树的前中后序遍历的统一写法。
二叉树
本文讲解以下图二叉树为准。
- 前序遍历(中 左 右):1 2 4 5 3 6 7
- 中序遍历(左 中 右):4 2 5 1 6 3 7
- 后序遍历(左 右 中):4 5 2 6 7 3 1
统一写法
var postorderTraversal = function(root) {
let stack = []
let preOrderAns = [], inOrderAns = [], postOrderAns = []
let cur = root
while(stack.length || cur != null) {
while(cur) {
preOrderAns.push(cur.val)
stack.push([cur, 0])
cur = cur.left
}
const [node, flag] = stack.pop()
if(!flag) {
inOrderAns.push(node.val)
stack.push([node, 1])
cur = node.right
} else {
postOrderAns.push(node.val)
}
}
console.log(preOrderAns)
console.log(inOrderAns)
return postOrderAns
};
我们来看一下入栈,出栈顺序:
- 1 入栈 flag 0
- 2 入栈 flag 0
- 4 入栈 flag 0
- 4 出栈 flag 0
- 4 入栈 flag 1
- 4 出栈 flag 1
- 2 出栈 flag 0
- 2 入栈 flag 1
- 5 入栈 flag 0
- 5 出栈 flag 0
- 5 入栈 flag 1
- 5 出栈 flag 1
- 2 出栈 flag 1
- 1 出栈 flag 0
- 1 入栈 flag 1
- 3 入栈 flag 0
- 6 入栈 flag 0
- 6 出栈 flag 0
- 6 入栈 flag 1
- 6 出栈 flag 1
- 3 出栈 flag 0
- 3 入栈 flag 1
- 7 入栈 flag 0
- 7 出栈 flag 0
- 7 入栈 flag 1
- 7 出栈 flag 1
- 3 出栈 flag 1
- 1 出栈 flag 1
Tips
前序遍历结果:将上述 入栈 flag 为 0 找出,1 2 4 5 3 6 7
中序遍历结果:将上述 出栈 flag 为 0 找出,4 2 5 1 6 3 7
后序遍历结果:将上述 出栈 flag 为 1 找出,4 5 2 6 7 3 1