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

前言

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

概念

二叉树遍历(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);
相关推荐
fie888913 小时前
NSCT(非下采样轮廓波变换)的分解和重建程序
算法
晨晖214 小时前
单链表逆转,c语言
c语言·数据结构·算法
im_AMBER15 小时前
Leetcode 78 识别数组中的最大异常值 | 镜像对之间最小绝对距离
笔记·学习·算法·leetcode
鼾声鼾语16 小时前
matlab的ros2发布的消息,局域网内其他设备收不到情况吗?但是matlab可以订阅其他局域网的ros2发布的消息(问题总结)
开发语言·人工智能·深度学习·算法·matlab·isaaclab
LYFlied16 小时前
【每日算法】LeetCode 25. K 个一组翻转链表
算法·leetcode·链表
Swizard16 小时前
别再迷信“准确率”了!一文读懂 AI 图像分割的黄金标尺 —— Dice 系数
python·算法·训练
s090713616 小时前
紧凑型3D成像声纳实现路径
算法·3d·声呐·前视多波束
可爱的小小小狼16 小时前
算法:二叉树遍历
算法
d111111111d17 小时前
在STM32函数指针是什么,怎么使用还有典型应用场景。
笔记·stm32·单片机·嵌入式硬件·学习·算法
AI科技星18 小时前
质量定义方程常数k = 4π m_p的来源、推导与意义
服务器·数据结构·人工智能·科技·算法·机器学习·生活