JavaScript 二叉树的遍历

发布于 2024-04-26 18:44:16 字数 2305 浏览 29 评论 0

以一定的顺序规则,逐个访问二叉树的所有结点,这个过程就是二叉树的遍历。

  • 先序遍历
  • 中序遍历
  • 后序遍历
  • 层次遍历

先序中序后序 其实是针对于根结点的,也就是说在循环结点时:

  • 先序:根节点 > 左子树 > 右子树
  • 中序:左子树 > 根节点 > 右子树
  • 后序:左子树 > 右子树 > 根节点

按照实现方式不同,又可以分为

  • 递归遍历(先、中、后序遍历)
  • 迭代遍历(层次遍历)

用 js 代码生成一颗二叉树

const root = {
  val: '根结点',
  left: {
    val: '左子树 1'
    left: {
      val: '左子树 1 的左子树'
      left: null,
      right: null
    },
    right: {
      val: '左子树 1 的右子树',
      left: null,
      right: null
    }
  },
  right: {
    val: '右子树 1',
    left: null,
    right: null
  }
}

递归函数的编写要点

  • 递归式 :它指的是你每一次重复的内容是什么。在这里,我们要做先序遍历,那么每一次重复的其实就是 根结点 -> 左子树 -> 右子树 这个旅行路线。
  • 递归边界 :指遍历什么时候停下来,编码实现里对应着一个 return 语句

先序代码逻辑思路

const recursion = (root) => {
  // 所有遍历函数的入参为根结点对象-注意所有是包含中序、后序
  if (!root) return
  
  console.log('当前结点', root.val) // 注意当前结点调用的位置,与中序、后续对比
  recursion(root.left)
  recursion(root.right)
}

中序代码逻辑思路

// 所有遍历函数的入参都是树的根结点对象
function inorder(root) {
    // 递归边界,root 为空
    if(!root) {
        return 
    }
     
    // 递归遍历左子树 
    inorder(root.left)  
    // 输出当前遍历的结点值
    console.log('当前遍历的结点值是:', root.val)  
    // 递归遍历右子树  
    inorder(root.right)
}

后序代码逻辑思路

function postorder(root) {
    // 递归边界,root 为空
    if(!root) {
        return 
    }
     
    // 递归遍历左子树 
    postorder(root.left)  
    // 递归遍历右子树  
    postorder(root.right)
    // 输出当前遍历的结点值
    console.log('当前遍历的结点值是:', root.val)  
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

依 靠

暂无简介

文章
评论
28 人气
更多

推荐作者

櫻之舞

文章 0 评论 0

弥枳

文章 0 评论 0

m2429

文章 0 评论 0

野却迷人

文章 0 评论 0

我怀念的。

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文