这是我参与「掘金日新计划 · 8 月更文挑战」的第4天,点击查看活动详情
题目
给定一个二叉树,返回所有从根节点到叶子节点的路径。
说明: 叶子节点是指没有子节点的节点。
示例:
输入: 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]
这是一个单边树:
带入到代码中去:
leftpath = ['3']
leftpath = ['2->3']
leftpath = ['1->2->3']