先序遍历
// 前序遍历 非递归版
// 非递归版都需要用到栈
var preorderTraversal = function(root) {
if (!root) {
return []
}
let stack = []
let result = []
while (root || stack.length > 0) {
while (root) {
result.push(root.val)
stack.push(root)
root = root.left
}
if (stack.length > 0) {
root = stack.pop()
root = root.right
}
}
return result
};
// 前序遍历 递归版
var preorderTraversal = function(root) {
let result = []
let preorder = (root) => {
if (root) {
result.push(root.val)
preorderTraversal(root.left)
preorderTraversal(root.right)
}
}
return result
};
中序遍历
// 中序遍历 非递归版
// 非递归版都需要用到栈
var inorderTraversal = function(root) {
if (!root) {
return []
}
let stack = []
let result = []
while (root || stack.length > 0) {
while (root) {
stack.push(root)
root = root.left
}
if (stack.length > 0) {
root = stack.pop()
result.push(root.val)
root = root.right
}
}
return result
};
// 递归版
var inorderTraversal = function(root) {
let result = []
let inorder = (node) => {
if (!node) {
return
}
inorder(node.left);
result.push(node.val);
inorder(node.right);
}
inorder(root)
return result
};
后序遍历
// 非递归版本
var postorderTraversal = function(root) {
let node = root
let lastVisit = root
let stack = []
let result = []
while (node || stack.length > 0) {
while (node) {
stack.push(node)
node = node.left
}
node = stack[stack.length - 1]
if (!node.right || node.right === lastVisit) {
result.push(node.val)
stack.pop()
lastVisit = node
node = null
} else {
node = node.right
}
}
return result
};
// 递归版本
var postorderTraversal = function(root) {
let result = []
let postorder = (node) => {
if (!node) {
return
}
postorder(node.left)
postorder(node.right)
result.push(node.val)
}
postorder(root)
return result
};