前序遍历 LeetCode144
- 递归
var preorderTraversal = function(root) {
let number = new Array()
function traverse(node) {
if(node === null) return
number.push(node.val)
traverse(node.left)
traverse(node.right)
}
traverse(root)
return number
};
- 迭代
var preorderTraversal = function(root) {
let number = new Array()
let stack = new Array()
let node = root
while(node != null || stack.length != 0) {
while(node != null) {
number.push(node.val)
stack.push(node)
node = node.left
}
node = stack.pop()
node = node.right
}
return number
};
中序遍历 LeetCode94
- 递归
var inorderTraversal = function(root) {
let number = new Array()
function traverse(node) {
if(node == null) return
if(node.left != null) traverse(node.left)
number.push(node.val)
if(node.right != null) traverse(node.right)
}
traverse(root)
return number
};
- 迭代
var inorderTraversal = function(root) {
let number = new Array()
let stack = new Array()
let node = root
while(node != null || stack.length != 0) {
while(node != null) {
stack.push(node)
node = node.left
}
node = stack.pop()
number.push(node.val)
node = node.right
}
return number
};
后序遍历 LeetCode145
- 递归
var postorderTraversal = function(root) {
let number = new Array()
function traverse(node) {
if(node == null) return
if(node.left != null) traverse(node.left)
if(node.right != null) traverse(node.right)
number.push(node.val)
}
traverse(root)
return number
};
-
迭代
-
反转法,观察可得后序遍历结果刚好同”中-右-左“遍历结果相反
var postorderTraversal = function(root) { let number = new Array() let stack = new Array() let node = root while(node != null || stack.length != 0) { while(node != null) { number.push(node.val) stack.push(node) node = node.right } node = stack.pop() node = node.left } number.reverse() return number };
-
访问标记法,待访问结点出栈时为若不存在标记则将其标记为 true 并重新入栈,出栈时存在标记则将值记录
var postorderTraversal = function(root) { let number = new Array() let stack = new Array() let map = new Map() let node = root while(node != null || stack.length != 0) { while(node != null) { stack.push(node) node = node.left } node = stack.at(-1) // 待访问结点 while(stack.length != 0 && map.has(node)) { // 左右侧均已经访问 number.push(node.val) stack.pop() node = stack.at(-1) // 更新待访问结点 } if(stack.length != 0) { // 右侧还未访问 map.set(node, true) node = node.right } } return number };
-