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

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

前言


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


二叉树是一种每个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);


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


相关文章
|
3月前
|
缓存 供应链 监控
1688item_search_factory - 按关键字搜索工厂数据接口深度分析及 Python 实现
item_search_factory接口专为B2B电商供应链优化设计,支持通过关键词精准检索工厂信息,涵盖资质、产能、地理位置等核心数据,助力企业高效开发货源、分析产业集群与评估供应商。
|
存储 编解码 安全
现代IM系统中聊天消息的同步和存储方案探讨
本文原作者:木洛,阿里云高级技术专家,内容有删减和修订,感谢原作者。 1、前言 IM全称是『Instant Messaging』,中文名是即时通讯。在这个高度信息化的移动互联网时代,生活中IM类产品已经成为必备品,比较有名的如钉钉、微信、QQ等以IM为核心功能的产品。
5434 0
|
3月前
|
存储 人工智能 运维
从“看得见”到“能决策”:Operation Intelligence 重构企业智能运维新范式
从 Observability 到 Operation Intelligence,日志服务 SLS 与云监控 2.0 协力之下,为企业打造高效、稳定、智能运营的数字化中枢,让复杂系统变得可视、可管、可优。
|
3月前
|
人工智能 安全 搜索推荐
面向阿里云百炼用户的AI安全护栏服务
本服务专为百炼平台用户提供,旨在提升大模型的文字输入和输出安全审核体验。在遵守百炼平台红线管控政策的基础上,我们提供了灵活的审核标签管理功能,允许用户根据需要开启或关闭特定审核标签。此外,我们还提供定制化的安全策略配置服务,以满足不同用户的个性化需求。
219 0
|
8月前
|
存储 关系型数据库 分布式数据库
|
4月前
|
监控 算法 安全
抖音电商API短视频挂接,商品曝光量翻倍!
在抖音电商API支持下,商家可通过短视频挂接商品,实现曝光量翻倍。本文详解操作步骤与优化策略,助您高效提升转化与销量。立即掌握短视频营销新技能!
293 0
|
存储 关系型数据库 MySQL
解决mysql存储特殊文字(表情符号)utf8mb4
一、背景 爬取数据过程中,会遇到一些特殊的字符入库出错的问题,比如二进制数据、比如特殊文字(类似QQ表情)等。 Siberian Husky fighting 这样的标题,后面就带有一个表情。
4753 0
|
机器学习/深度学习
深度学习最佳实践系列——权重w初始化
本文是深度学习最佳实践系列博客之权重初始化,主要介绍权重初始化的相关问题及方法,文中提及的权重初始化方法均可以应用于普通的神经网络、卷积神经网络和递归神经网络之中。
4127 0