头图

1. 题目

描述

给定一个二叉树root和一个值 sum ,判断是否有从根节点到叶子节点的节点值之和等于 sum 的路径。

1.该题路径定义为从树的根结点开始往下一直到叶子结点所经过的结点

2.叶子节点是指没有子节点的节点

3.路径只能从父节点到子节点,不能从子节点到父节点

4.总节点数目为n

例如:
给出如下的二叉树,sum=22 ,

返回true,因为存在一条路径 5→4→11→2的节点值之和为 22

数据范围:

1.树上的节点数满足 0 ≤n≤10000

2.每 个节点的值都满足∣val∣≤1000

要求:空间复杂度 O(n),时间复杂度 O(n)

进阶:空间复杂度 O(树的高度),时间复杂度 O(n)

示例1

输入:

{5,4,8,1,11,#,9,#,#,2,7},22

返回值:

true

示例2

输入:

{1,2},0

返回值:

false

示例3

输入:

{1,2},3

返回值:

true

示例4

输入:

{},0

返回值:

false

2. 解题思路

二叉树的路径总和,可以通过递归的方式完成。某个节点的路径总和可以分解为:从左子树中查找路径和(查找的数据为:target-node.val)、从右子树中查找路径和(查找的数据为:target-node.val),只要左右子树有一个查找到,则路径总和存在。

先来看路径总和是否满足递归条件,假如二叉树、路径总和如下图所示:

可以看出,路径总和问题满足递归条件,这时就可以通过递归来完成题目的解答。对于某一节点来说,路径总和只需从左右子树中查找到对应的目标值(注意:此时对应的目标值为target-node.val,即原目标值减去当前节点对应的值才是新目标值)。因此对应的递推公式如下:

如果文字描述的不太清楚,你可以参考视频的详细讲解。

3. 编码实现

核心代码如下:

/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param root TreeNode类
* @return  bool
 */
func hasPathSum(root *TreeNode, sum int) bool {
    // write code here

    // 2. 递归终止条件
    // 2.1递归终止条件:roo为空,没有找到
    if root == nil {
        return false
    }
    // 2.2 递归终止条件:左右子树为空,当前节点值等于需要找的值,则为 true
    if (root.Left == nil && root.Right == nil) && root.Val == sum {
        return true
    }

    // 1. 问题分解(递推公式)
    // 1.1 到左子树中查找
    hasLeft := hasPathSum(root.Left, sum-root.Val)
    // 1.2 到右子树中查找
    hasRight := hasPathSum(root.Right, sum-root.Val)
    // 1.3 有一个为找到,即为找到
    return hasLeft || hasRight
}

具体完整代码你可以参考下面视频的详细讲解。

4.小结

二叉树的路径总和,可以通过递归的方式完成。某个节点的路径总和可以分解为:从左子树中查找路径和(查找的数据为:target-node.val)、从右子树中查找路径和(查找的数据为:target-node.val),只要左右子树有一个查找到,则路径总和存在。


《数据结构与算法》深度精讲课程正式上线啦!七大核心算法模块全解析:

✅ 链表 ✅ 二叉树 ✅二分查找、排序 ✅ 堆、栈、队列 ✅回溯算法 ✅ 哈希算法 ✅ 动态规划

无论你是备战笔试面试、提升代码效率,还是突破技术瓶颈,这套课程都将为你构建扎实的算法思维底座。🔥立即加入学习打卡,与千名开发者共同进阶!

对于二叉树的相关算法,我们总结了一套【可视化+图解】方法,依据此方法来解决相关问题,算法变得易于理解,写出来的代码可读性高也不容易出错。具体也可以参考视频详细讲解。

今日佳句:纸上得来终觉浅,绝知此事要躬行。


好易学数据结构
1 声望0 粉丝