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

前言

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

概念

二叉树遍历(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);
相关推荐
zander25812 分钟前
138. 随机链表的复制
数据结构·算法·链表
过期动态19 分钟前
【LeetCode 热题 100】找到字符串中所有字母异位词
java·数据结构·算法·leetcode·职场和发展·rabbitmq
来一碗刘肉面29 分钟前
栈在递归中的应用
数据结构·算法
8K超高清40 分钟前
博冠获中国电影电视技术学会科技进步奖
人工智能·科技·算法·安全·接口隔离原则·智能硬件
微石科技1 小时前
长期慢病如何做好居家管理?宁波微石科技星梦云康改善周期数据零散短板
大数据·科技·物联网·算法
微露清风1 小时前
快速排序算法学习记录
学习·算法·排序算法
梓䈑7 小时前
【算法题攻略】BFS 解决FloodFill 算法、最短路问题、多源BFS 和 拓扑排序
c++·算法·宽度优先
Adios7949 小时前
设置交集大小至少为2
数据结构·算法·leetcode