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

前言

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

概念

二叉树遍历(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);
相关推荐
hashiqimiya5 分钟前
c++的头文件使用
开发语言·c++·算法
美狐美颜SDK开放平台38 分钟前
直播美颜sdk特效功能架构全解析:从图像处理到AI渲染的技术演进
图像处理·人工智能·算法·架构·1024程序员节·美颜sdk·直播美颜sdk
Swift社区1 小时前
LeetCode 412 - Fizz Buzz
算法·leetcode·职场和发展
小年糕是糕手1 小时前
【C/C++刷题集】二叉树算法题(一)
c语言·数据结构·c++·算法·leetcode·学习方法·改行学it
前端炒粉10 小时前
18.矩阵置零(原地算法)
javascript·线性代数·算法·矩阵
暴风鱼划水10 小时前
三维重建【0-D】3D Gaussian Splatting:相机标定原理与步骤
算法·3d
mount_myj13 小时前
敏感信息屏蔽(一)【java】
java·算法·极课堂
先做个垃圾出来………13 小时前
偏移量解释
数据结构·算法
FanXing_zl13 小时前
基于整数MCU的FOC控制定标策略深度解析
单片机·嵌入式硬件·mcu·算法·定点运算·q15