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

前言

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

概念

二叉树遍历(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);
相关推荐
LNTON羚通6 小时前
摄像机视频分析软件下载LiteAIServer视频智能分析平台玩手机打电话检测算法技术的实现
算法·目标检测·音视频·监控·视频监控
哭泣的眼泪4087 小时前
解析粗糙度仪在工业制造及材料科学和建筑工程领域的重要性
python·算法·django·virtualenv·pygame
Microsoft Word8 小时前
c++基础语法
开发语言·c++·算法
天才在此8 小时前
汽车加油行驶问题-动态规划算法(已在洛谷AC)
算法·动态规划
莫叫石榴姐9 小时前
数据科学与SQL:组距分组分析 | 区间分布问题
大数据·人工智能·sql·深度学习·算法·机器学习·数据挖掘
茶猫_10 小时前
力扣面试题 - 25 二进制数转字符串
c语言·算法·leetcode·职场和发展
肥猪猪爸12 小时前
使用卡尔曼滤波器估计pybullet中的机器人位置
数据结构·人工智能·python·算法·机器人·卡尔曼滤波·pybullet
readmancynn12 小时前
二分基本实现
数据结构·算法
萝卜兽编程12 小时前
优先级队列
c++·算法
盼海13 小时前
排序算法(四)--快速排序
数据结构·算法·排序算法