树的先序、中序、后序遍历、层次序遍历
先序遍历
var preorderTraversal = function (root) {
const res = [];
const stack = [];
let node = root;
while (node != null || stack.length > 0) {
if (!node) {
node = stack.pop();
}
res.push(node.val);
if(node.right){
stack.push(node.right);
}
node = node.left;
}
return res;
};
中序遍历
var inorderTraversal = function (root) {
const res = [], stack = [];
let node = root;
while (node != null || stack.length > 0) {
while (node) {
stack.push(node);
node = node.left;
}
if (!node) {
node = stack.pop();
}
res.push(node.val);
node = node.right;
}
return res;
};
后序遍历
var postorderTraversal = function (root) {
const res = [], stack = [];
let node = root;
while (node != null || stack.length) {
while (node) {
stack.push(node);
node = node.left;
}
if (stack[stack.length - 1].right) {
node = stack[stack.length - 1].right;
stack[stack.length - 1].right = null;
} else {
res.push(stack.pop().val);
}
}
return res;
};
层次序遍历
var levelOrder = function (root) {
if (!root) return [];
const queue = [root], res = [];
while (queue.length) {
const len = queue.length;
const arr = [];
for (let i = 0; i < len; ++i) {
let node = queue.shift();
arr.push(node.val)
if (node.left)
queue.push(node.left);
if (node.right)
queue.push(node.right);
}
res.push(arr);
}
return res;
};