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

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

前言


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


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


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


相关文章
|
机器学习/深度学习 存储 人工智能
MLOps:构建生产机器学习系统的最佳实践(上)
MLOps:构建生产机器学习系统的最佳实践
1186 0
MLOps:构建生产机器学习系统的最佳实践(上)
用Cadence Virtuoso绘制反相器教程(中)
用Cadence Virtuoso绘制反相器教程
1106 0
用Cadence Virtuoso绘制反相器教程(中)
|
传感器 存储 算法
嵌入式单片机智能手表实验之优秀
嵌入式单片机智能手表实验之优秀
404 0
嵌入式单片机智能手表实验之优秀
|
监控 开发者
传播过程模型 | 学习笔记
快速学习传播过程模型。
810 0
传播过程模型 | 学习笔记
|
存储 Java
java:int强制类型转换成byte
int 在java中是32位, byte是8位 原码:就是二进制码,最高位为符号位,0表示正数,1表示负数,剩余部分表示真值 反码:在原码的基础上,正数反码就是他本身,负数除符号位之外全部按位取反 补码:正数的补码就是自己本身, 负数的补码是在自身反码的基础上加1
java:int强制类型转换成byte
|
安全 jenkins 应用服务中间件
Jenkins(7)- 解决Linux下忘记Jenkins密码
Jenkins(7)- 解决Linux下忘记Jenkins密码
952 0
Jenkins(7)- 解决Linux下忘记Jenkins密码
|
机器学习/深度学习 人工智能 计算机视觉
计算机的顶会有哪些?
计算机的顶会有哪些?
1399 0
计算机的顶会有哪些?
|
Ubuntu 编译器 计算机视觉
OpenCV开发:ubuntu18.04下交叉编译OpenCV3.4.9到ARM64位平台RK3399(aarch64-linux-)
OpenCV开发:ubuntu18.04下交叉编译OpenCV3.4.9到ARM64位平台RK3399(aarch64-linux-)
1488 0
OpenCV开发:ubuntu18.04下交叉编译OpenCV3.4.9到ARM64位平台RK3399(aarch64-linux-)
|
Rust 前端开发 JavaScript
可能是最完善的 React+Vite 解决方案,阿里飞冰团队发布 icejs 2.0 版本
icejs 是一个基于 React 的渐进式研发框架,由淘系前端飞冰(ICE)团队于 2020.02 发布 1.0 版本,icejs 目前广泛服务于阿里内部以及社区用户,如下图所示,在阿里内部每天至少有 400 多个仓库基于 icejs 构建并发布,目前已经服务了内部 3K 多的开发者以及 5K 多项目。
1232 0
可能是最完善的 React+Vite 解决方案,阿里飞冰团队发布 icejs 2.0 版本