前端面试题——二叉树遍历

前言

二叉树遍历在各种算法和数据结构问题中都有广泛的应用,如二叉搜索树、表达式的树形表示、堆的实现等。同时也是前端面试中的常客,掌握好二叉树遍历算法对于一名合格的前端工程师来说至关重要。

概念

二叉树遍历(Binary Tree Traversal)是指按照某种规则访问二叉树中所有节点的过程。由于二叉树是一个递归的数据结构,因此遍历操作通常也是递归进行的。

二叉树的遍历主要有四种方式:前序遍历(Pre-order Traversal)、中序遍历(In-order Traversal)、后序遍历(Post-order Traversal)和层次遍历(Level-order Traversal)。

代码原理

首先定义一个 TreeNode 类来表示二叉树的节点

javascript 复制代码
class TreeNode {  
  constructor(val, left = null, right = null) {  
    this.val = val;        // 节点的值  
    this.left = left;      // 左子节点,默认为null  
    this.right = right;    // 右子节点,默认为null  
  }  
}

前序遍历

定义遍历方法

javascript 复制代码
function preorderTraversal(root) {  
  if (root === null) {  
    return;          // 如果节点为空,则直接返回  
  }  
  console.log(root.val);            // 访问当前节点的值  
  preorderTraversal(root.left);     // 递归遍历左子树  
  preorderTraversal(root.right);    // 递归遍历右子树  
}

创建二叉树

javascript 复制代码
// 创建二叉树  
const root = new TreeNode(1);  
root.left = new TreeNode(2);  
root.right = new TreeNode(3);  
root.left.left = new TreeNode(4);  
root.left.right = new TreeNode(5);  

调用方法执行遍历

javascript 复制代码
// 执行遍历  
console.log("前序遍历:");  
preorderTraversal(root);  

中序遍历

定义遍历方法

javascript 复制代码
// 中序遍历  
function inorderTraversal(root) {  
  if (root === null) {  
    return;  
  }  
  inorderTraversal(root.left); // 遍历左子树  
  console.log(root.val); // 访问根节点  
  inorderTraversal(root.right); // 遍历右子树  
} 

创建二叉树

javascript 复制代码
// 创建二叉树  
const root = new TreeNode(1);  
root.left = new TreeNode(2);  
root.right = new TreeNode(3);  
root.left.left = new TreeNode(4);  
root.left.right = new TreeNode(5);  

调用方法执行遍历

javascript 复制代码
console.log("中序遍历:");  
inorderTraversal(root);  

后序遍历

定义遍历方法

javascript 复制代码
// 后序遍历  
function postorderTraversal(root) {  
  if (root === null) {  
    return;  
  }  
  postorderTraversal(root.left); // 遍历左子树  
  postorderTraversal(root.right); // 遍历右子树  
  console.log(root.val); // 访问根节点  
}  

创建二叉树

javascript 复制代码
// 创建二叉树  
const root = new TreeNode(1);  
root.left = new TreeNode(2);  
root.right = new TreeNode(3);  
root.left.left = new TreeNode(4);  
root.left.right = new TreeNode(5);  

调用方法执行遍历

javascript 复制代码
console.log("后序遍历:");  
postorderTraversal(root);  

层次遍历

定义遍历方法

javascript 复制代码
// 层次遍历(使用队列)  
function levelOrderTraversal(root) {  
  if (root === null) {  
    return;  
  }  
  const queue = [root]; // 初始化队列,将根节点入队  
  while (queue.length > 0) {  
    const node = queue.shift(); // 出队一个节点  
    console.log(node.val); // 访问该节点  
    if (node.left !== null) {  
      queue.push(node.left); // 左子节点入队  
    }  
    if (node.right !== null) {  
      queue.push(node.right); // 右子节点入队  
    }  
  }  
}  

创建二叉树

javascript 复制代码
// 创建二叉树  
const root = new TreeNode(1);  
root.left = new TreeNode(2);  
root.right = new TreeNode(3);  
root.left.left = new TreeNode(4);  
root.left.right = new TreeNode(5);  

调用方法执行遍历

javascript 复制代码
console.log("层次遍历:");  
levelOrderTraversal(root);
相关推荐
聚客AI11 小时前
🙋‍♀️Transformer训练与推理全流程:从输入处理到输出生成
人工智能·算法·llm
大怪v14 小时前
前端:人工智能?我也会啊!来个花活,😎😎😎“自动驾驶”整起!
前端·javascript·算法
惯导马工16 小时前
【论文导读】ORB-SLAM3:An Accurate Open-Source Library for Visual, Visual-Inertial and
深度学习·算法
骑自行车的码农17 小时前
【React用到的一些算法】游标和栈
算法·react.js
博笙困了17 小时前
AcWing学习——双指针算法
c++·算法
moonlifesudo18 小时前
322:零钱兑换(三种方法)
算法
NAGNIP1 天前
大模型框架性能优化策略:延迟、吞吐量与成本权衡
算法
美团技术团队2 天前
LongCat-Flash:如何使用 SGLang 部署美团 Agentic 模型
人工智能·算法
Fanxt_Ja2 天前
【LeetCode】算法详解#15 ---环形链表II
数据结构·算法·leetcode·链表
侃侃_天下2 天前
最终的信号类
开发语言·c++·算法