二叉树与前序遍历、中序遍历、后续遍历

简介: 二叉树相关的面试题也是前端面试中非常重要的一部分。那二叉树是什么样的一种结构呢?

前言


二叉树相关的面试题也是前端面试中非常重要的一部分。那二叉树是什么样的一种结构呢?


二叉树是一种每个Node节点都不超过两个子树的树结构。一个完整的二叉树,每个节点都是由根节点、左节点、右节点组成。


// 定义节点类型
interface TreeNode {
  // 当前节点的值
  value: number;
  // left节点有可能也是个树,也有可能直接是null
  left: TreeNode | null;
  // right节点有可能也是个树,也有可能直接是null
  right: TreeNode | null;
}
// 定义一个二叉树
const binaryTree: TreeNode = {
  value: 5,
  left: {
    value: 3,
    left: {
      value: 2,
      left: null,
      right: null
    },
    right: {
      value: 4,
      left: null,
      right: null
    }
  },
  right: {
    value: 7,
    left: {
      value: 6,
      left: null,
      right: null
    },
    right: {
      value: 8,
      left: null,
      right: null
    }
  }
}


在二叉树中,如果想遍历所有二叉树的节点,有三种不同的顺序:前序遍历、中序遍历、后序遍历


前序遍历


首先我们要明白什么是前序遍历,是指展示节点的顺序依次为:root -> left -> right。注意,一定要遵守这个规则。


我们从代码上来看一下。


/**
 * @method preOrderTraversal
 * @description 二叉树的前序遍历
 * @param tree TreeNode | null 二叉树
 * @returns void
 */
function preOrderTraversal(tree: TreeNode | null) {
  // 1. 首先输出root节点即根节点
  // 需要注意的时,tree有可能是null,临界条件判断,或者可以说是递归终止的条件
  if (!tree) return;
  // 输出根节点的值
  console.log(tree.value);
  // 2. 输出left节点
  preOrderTraversal(tree.left);
  // 3. 输出right节点
  preOrderTraversal(tree.right);
}


调用函数,看下输出的结果:


// 5、3、2、4、7、6、8 => root -> left -> right
preOrderTraversal(binaryTree);


中序遍历


中序遍历的规则是:left -> root -> right


继续上代码:


/**
 * @method preOrderTraversal
 * @description 二叉树的前序遍历
 * @param tree TreeNode | null 二叉树
 * @returns void
 */
function middleOrderTraversal(tree: TreeNode | null) {
  // 临界点判断
  if (!tree) return;
  // 1. 先输出left的值
  middleOrderTraversal(tree.left);
  // 2. 输出root根节点的值
  console.log(tree.value);
  // 3. 输出right的值
  middleOrderTraversal(tree.right);
}


调用函数,看下输出的结果:


// 2、3、4、5、6、7、8 => left -> root -> right
middleOrderTraversal(binaryTree);


后序遍历


后序遍历的原则是:left -> right -> root


/**
 * @method postOrderTraversal
 * @description 二叉树的后序遍历
 * @param tree 
 * @returns 
 */
function postOrderTraversal(tree: TreeNode | null) {
  // 临界点判断
  if (!tree) return;
  // 1. 先输出left的值
  postOrderTraversal(tree.left);
  // 2. 输出right的值
  postOrderTraversal(tree.right);
  // 3. 输出根节点的值
  console.log(tree.value);
}


调用函数,看下输出的结果:


// 2、4、3、6、8、7、5 => left -> root -> right
postOrderTraversal(binaryTree);


二叉树的遍历非常简单,主要考察的是对前序遍历、中序遍历、后序遍历概念的理解。


相关文章
|
8月前
|
人工智能 Cloud Native 安全
Bolt.diy 部署与应用体验全流程总结
按照官方指引,我完成了 Bolt.diy 的部署与测试。通过云原生应用开发平台 CAP,默认配置下部署仅需 1 分钟。首次使用需授权访问控制,部署完成后进入示例应用。注意,资源须通过 HTTPS 提供以支持 WebAssembly 和 SharedArrayBuffer。 随后,在阿里云百炼平台创建 API-KEY 并配置到 Bolt.diy 中,开始尝试提示词创作。例如输入中端 SaaS 首页需求后,Bolt.diy 自动生成代码并展示预览效果,生成效率和质量令人满意。
|
9月前
|
自然语言处理 JavaScript 数据管理
HarmonyOS Next 实战卡片开发 01
本文详细介绍了 HarmonyOS Next 中的卡片开发,涵盖基本概念、类型、创建、配置、能力支持、生命周期及通信等内容。Form Kit 提供将应用重要信息前置到服务卡片的功能,减少跳转层级,适用于嵌入系统应用(如桌面),支持拉起页面与发送消息等交互。卡片分为静态与动态两种类型,分别适用于不同刷新需求场景。
252 0
HarmonyOS Next 实战卡片开发 01
|
10月前
|
机器学习/深度学习 存储 自然语言处理
《Peephole LSTM:窥视孔连接如何开启性能提升之门》
Peephole LSTM是LSTM的一种变体,通过引入窥视孔连接,使各个门(输入门、遗忘门和输出门)能够直接访问细胞状态,从而在门控决策中提供更多的上下文信息。这使得模型能更精准地保留和利用序列中的关键长期依赖关系,避免信息丢失,提升对复杂序列数据的处理能力,在语音识别、自然语言处理等领域表现出色。
377 15
|
8月前
|
传感器 SQL 运维
2025 年中国中小企业数字化转型:Websoft9 开源托管平台的价值
Websoft9 以开源技术为核心,打造零门槛、低成本的数字化基座,提供 200+ 开源模板(如 Odoo、Nextcloud),助力企业快速部署与扩展。通过容器化技术、多云适配及主动防御体系,保障安全与兼容性。行业级解决方案覆盖制造、教育、法律等领域,实现数据驱动决策闭环。生态创新模式鼓励技术反哺与商业裂变,形成“标准化模板 + 自由扩展”路径,使中小企业从技术消费者转型为生态共建者,推动数字化转型成为价值创造的永动机。
|
10月前
|
存储 人工智能 算法
《AI 剧本生成与动画创作》解决方案评测
《AI 剧本生成与动画创作》解决方案评测
273 11
|
人工智能 算法 芯片
《C++与 ASIC 芯片:人工智能领域的强力搭档》
在AI发展中,C++与ASIC芯片的协同应用成为关键探索方向。C++以其高性能和对底层硬件的精细控制,与ASIC芯片的高度优化计算能力相结合,共同推动AI系统在性能、能效上的突破,特别是在智能安防、自动驾驶等领域展现巨大潜力。
194 11
|
前端开发 安全 数据库
使用Python开发独立站的全面指南
本文详细介绍了如何使用Python及其Web框架Django和Flask快速搭建功能完善、易于管理的独立站。从Python和Web开发基础讲起,逐步覆盖环境搭建、项目创建、数据库设计、视图与URL路由、模板创建、表单处理、测试调试、部署优化及安全维护等内容,旨在帮助开发者高效构建稳定的Web应用。
449 1
|
12月前
|
人工智能 自然语言处理 算法
“幽灵职位”泛滥:招聘广告背后的真相与求职者的困境
“幽灵职位”泛滥:招聘广告背后的真相与求职者的困境
|
机器学习/深度学习 人工智能 运维
怎么样把数据治理和人工智能结合起来?
将数据治理和人工智能结合起来,可以提高数据管理的效率和准确性,减少风险和成本。未来,随着人工智能技术的不断发展和应用,数据治理和人工智能的结合将会更加紧密,为企业和社会带来更多的机遇和挑战。
|
设计模式 SQL 安全
【编程进阶知识】Java单例模式深度解析:饿汉式与懒汉式实现技巧
本文深入解析了Java单例模式中的饿汉式和懒汉式实现方法,包括它们的特点、实现代码和适用场景。通过静态常量、枚举类、静态代码块等方式实现饿汉式,通过非线程安全、同步方法、同步代码块、双重检查锁定和静态内部类等方式实现懒汉式。文章还对比了各种实现方式的优缺点,帮助读者在实际项目中做出更好的设计决策。
391 0