树的结构
class TreeNode {constructor(val = 0, left = null, right = null) {this.val = val;this.left = left;this.right = right;}
}
先序遍历
function preorderTraversal(root) {if (root === null) return [];return [root.val,...preorderTraversal(root.left), // 先遍历左子树...preorderTraversal(root.right), // 再遍历右子树];
}
中序遍历
function inorderTraversal(root) {if (root === null) return [];return [...inorderTraversal(root.left), // 先遍历左子树root.val, // 然后是根节点...inorderTraversal(root.right), // 最后遍历右子树];
}
后序遍历
function postorderTraversal(root) {if (root === null) return [];return [...postorderTraversal(root.left), // 先遍历左子树...postorderTraversal(root.right), // 然后遍历右子树root.val, // 最后是根节点];
}
层序遍历
function levelOrderTraversal(root) { // 如果树为空,直接返回空数组if (root === null) return []; // 存储遍历结果的数组const result = []; // 队列用于按层遍历节点,初始时将根节点加入队列const queue = [root]; // 当队列不为空时,继续遍历while (queue.length > 0) { // 存储当前层的节点值const level = []; // 当前队列长度,即当前层的节点数const size = queue.length; // 遍历当前层的所有节点for (let i = 0; i < size; i++) { // 从队列中移除一个节点并访问它const node = queue.shift(); // 出队 // 将当前节点的值加入当前层数组level.push(node.val); // 访问当前节点 // 如果当前节点有左子节点,左子节点入队if (node.left) queue.push(node.left); // 左子树入队 // 如果当前节点有右子节点,右子节点入队if (node.right) queue.push(node.right); // 右子树入队 }// 将当前层的节点值加入结果数组result.push(level); }// 返回最终的层序遍历结果return result;
}