算法:二叉树的所有路径

173 阅读2分钟

这是我参与「掘金日新计划 · 8 月更文挑战」的第4天,点击查看活动详情

题目

给定一个二叉树,返回所有从根节点到叶子节点的路径。

说明:  叶子节点是指没有子节点的节点。

示例:

image.png
输入: root = [1,2,3,null,5]
输出: ["1->2->5","1->3"]

来源:力扣(LeetCode)

链接:leetcode-cn.com/problems/bi…

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


深度优先遍历

这个题目是深度优先遍历的典型问题。深度优先搜索是一种枚举所有完整路径以遍历所有情况的搜索方法。使用递归可以很好的实现深度优先遍历。

特点就是当前节点有子节点的时候就去往下查询子节点

解题思路

深度优先

  • 使用递归返回当前节点所有左右子节点的路径
  • 递归返回条件 1. 如果节点为空
  • 递归返回条件 2. 如果节点为叶子节点
  • 当遍历到叶子节点的时候为当前路径的结束。并且将当前路径加入结果集。

解法1

let binaryTreePaths = function (root) {
  let res = []
  if (!root) {
    return res
  }

  if (!root.left && !root.right) {
    return [`${root.val}`]
  }

  let leftPaths = binaryTreePaths(root.left)
  let rightPaths = binaryTreePaths(root.right)

  leftPaths.forEach((leftPath) => {
    res.push(`${root.val}->${leftPath}`)
  })
  rightPaths.forEach((rightPath) => {
    res.push(`${root.val}->${rightPath}`)
  })

  return res
}

分析

这个解法是 ssh_晨曦时梦见兮 在文章 写给前端的算法进阶指南给出的解法。不得不说,这个代码看起来结构非常清晰。所有的递归条件,和重复项都一致。别出心裁的是,因为题解要求是个路径数组,所以,当节点是根节点的时候,返回了包含当前根节点的数组,此时只有一个值。

root = [1,2,null,3,null,null,null]

这是一个单边树:

image.png

带入到代码中去:

leftpath = ['3']

leftpath = ['2->3']

leftpath = ['1->2->3']