3.手写JavaScript前序中序后序递归遍历二叉树

一、核心思想

1.前序

本质是中左右,对每个结点执行中左右的操作,全部结点执行完毕后,返回结果

2.中序

本质是左中右,对每个结点执行左中右的操作,全部结点执行完毕后,返回结果

3.后序

本质是左右中,对每个结点执行左右中的操作,全部结点执行完毕后,返回结果

ps:注意初始值为空的情况

二、代码实现

1.前序

javascript 复制代码
let tree = {
  val: 1,
  leftChild: {
    val: 2,
    leftChild: {
      val: 3,
      leftChild: {
        val: 4,
      },
      rightChild: {
        val: 5,
      },
    },
    rightChild: {
      val: 6,
    },
  },
  rightChild: {
    val: 7,
    leftChild: {
      val: 8,
    },
    rightChild: {
      val: 9,
      leftChild: {
        val: 10,
      },
    },
  },
};
/**
 * 前序遍历二叉树
 * @param {Array} root 传入数组
 * @return {Array} list 返回深度遍历二叉树数组结果
 */
function preOrder(root){
  let list = []
  if (!root) {
    return []
  }
  function order(root){
    list.push(root.val)
    if (root.leftChild) {
      order(root.leftChild)
    }
    if (root.rightChild) {
      order(root.rightChild)
    }
  }
  order(root)
  return list
}
console.log(preOrder(tree))
// [
//   1, 2, 3, 4,  5,
//   6, 7, 8, 9, 10
// ]

2.中序

javascript 复制代码
let tree = {
  val: 1,
  leftChild: {
    val: 2,
    leftChild: {
      val: 3,
      leftChild: {
        val: 4,
      },
      rightChild: {
        val: 5,
      },
    },
    rightChild: {
      val: 6,
    },
  },
  rightChild: {
    val: 7,
    leftChild: {
      val: 8,
    },
    rightChild: {
      val: 9,
      leftChild: {
        val: 10,
      },
    },
  },
};
/**
 * 中序遍历二叉树
 * @param {Array} root 传入数组
 * @return {Array} list 返回深度遍历二叉树数组结果
 */
function midOrder(root){
  let list = []
  if (!root) {
    return []
  }
  function order(root){
    if (root.leftChild) {
      order(root.leftChild)
    }
    list.push(root.val)
    if (root.rightChild) {
      order(root.rightChild)
    }
  }
  order(root)
  return list
}
console.log(midOrder(tree))
// [
//   4, 3, 5,  2, 6,
//   1, 8, 7, 10, 9
// ]

3.后序

javascript 复制代码
let tree = {
  val: 1,
  leftChild: {
    val: 2,
    leftChild: {
      val: 3,
      leftChild: {
        val: 4,
      },
      rightChild: {
        val: 5,
      },
    },
    rightChild: {
      val: 6,
    },
  },
  rightChild: {
    val: 7,
    leftChild: {
      val: 8,
    },
    rightChild: {
      val: 9,
      leftChild: {
        val: 10,
      },
    },
  },
};
/**
 * 后序遍历二叉树
 * @param {Array} root 传入数组
 * @return {Array} list 返回深度遍历二叉树数组结果
 */
function afterOrder(root){
  let list = []
  if (!root) {
    return []
  }
  function order(root){
    if (root.leftChild) {
      order(root.leftChild)
    }
    if (root.rightChild) {
      order(root.rightChild)
    }
    list.push(root.val)
  }
  order(root)
  return list
}
console.log(afterOrder(tree))
// [
//   4,  5, 3, 6, 2,
//   8, 10, 9, 7, 1
// ]
相关推荐
刺客-Andy28 分钟前
React 第七十节 Router中matchRoutes的使用详解及注意事项
前端·javascript·react.js
图灵学术计算机论文辅导35 分钟前
论文推荐|迁移学习+多模态特征融合
论文阅读·人工智能·深度学习·计算机网络·算法·计算机视觉·目标跟踪
threejs源码翻译官1 小时前
显微镜图像处理【优化】- 使用图像风格迁移技术放大图像细节
算法
强德亨上校2 小时前
贪心算法(Greedy Algorithm)详解
算法·贪心算法
zzywxc7872 小时前
详细探讨AI在金融、医疗、教育和制造业四大领域的具体落地案例,并通过代码、流程图、Prompt示例和图表等方式展示这些应用的实际效果。
开发语言·javascript·人工智能·深度学习·金融·prompt·流程图
大明882 小时前
用 mouseover/mouseout 事件代理模拟 mouseenter/mouseleave
前端·javascript
林太白2 小时前
Nuxt.js搭建一个官网如何简单
前端·javascript·后端
晴空雨2 小时前
一个符号让 indexOf 判断更优雅!JavaScript 位运算的隐藏技巧
前端·javascript
浮灯Foden3 小时前
算法-每日一题(DAY13)两数之和
开发语言·数据结构·c++·算法·leetcode·面试·散列表
前端snow3 小时前
前端无接口实现Table导出Excel的两种方案(附完整代码)
javascript·vue.js·react.js