前序便历:中左右
中序便历:左中右
后序遍历:左右中
层序遍历:广度优先
递归
var preorderTraversal = function (root) {
const traversal = (node, arr) => {
if (node === null) {
return null;
}
arr.push(node.val);
traversal(node.left, arr);
traversal(node.right, arr);
};
const res = [];
traversal(root, res);
return res;
};
迭代
// 前序
var preorderTraversal = function (root) {
if (root === null) {
return [];
}
const queue = [];
const res = [];
queue.push(root);
while (queue.length) {
const curr = queue.pop();
res.push(curr.val);
curr.right && queue.push(curr.right);
curr.left && queue.push(curr.left);
}
return res;
};
// 后序
var postorderTraversal = function (root) {
if (root === null) {
return [];
}
const queue = [];
const res = [];
queue.push(root);
while (queue.length) {
const curr = queue.pop();
res.push(curr.val);
curr.left && queue.push(curr.left);
curr.right && queue.push(curr.right);
}
return res.reverse();
};
// 中序
var inorderTraversal = function (root) {
let stack = [];
let res = [];
let cur = root;
while (stack.length || cur) {
if (cur.left) {
stack.push(cur.left);
cur = cur.left;
} else {
cur = stack.pop();
res.push(cur.val);
cur = cur.right;
}
}
};
空指针标记
// 统一迭代法 空指针标记 后面有null的节点才需要处理
/**
* @param {TreeNode} root
* @return {number[]}
*/
var preorderTraversal = function (root) {
let stack = [];
let res = [];
if (root) {
stack.push(root);
}
while (stack.length) {
const cur = stack.pop();
if (!cur) {
res.push(stack.pop().val);
continue;
}
cur.right && stack.push(cur.right);
cur.left && stack.push(cur.left);
stack.push(cur);
stack.push(null);
}
return res;
};
层序便历(广度优先)
// 层序便历
var levelOrder = function (root) {
let queue = [];
let res = [];
// 注意这里可能会出错
if (!root) return res;
queue.push(root);
while (queue.length) {
let length = queue.length;
let currList = [];
for (let i = 0; i < length; i++) {
let cur = queue.shift();
currList.push(cur.val);
cur.left && queue.push(cur.left);
cur.right && queue.push(cur.right);
}
res.push(currList);
}
return res;
};