重温算法之路径总和

130 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情

一.题目介绍

1.题目来源

链接:LeetCode

2.题目

给你二叉树的根节点root和一个表示目标和的整数targetSum。判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和targetSum。如果存在,返回true;否则,返回false。叶子节点是指没有子节点的节点。

image.png

二.具体实现

1.实现思路

思路就是深度优先,当树不为空时,先找到叶子节点,然后往左子树搜索再往右子树搜索,如果目标值与节点数之差为0则代表找到了符合条件的即存在,反子则不存在。

2.实现代码

1)自己的实现方式

public boolean hasPathSum(TreeNode root, int targetSum) {
    if (root == null) {
        return false;
    }
    return dfs(root, targetSum);
}
private boolean dfs(TreeNode root, int num) {
    //递归的边界 节点为null
    if (root.left == null && root.right == null){
        return (num - root.val) == 0;
    }
    //往左子树搜索
    if (root.left != null && dfs(root.left,num - root.val)){
        return true;
    }

    //往右子树搜索
    if (root.right != null && dfs(root.right,num - root.val)){
        return true;
    }
    return false;
}

2)题友的实现方式

将其转换成求解从root.left或者root.right到叶子节点是否存在路径和为sum-root.val的路径,即 hasPathSum(root.left, sum - root.val) || hasPathSum(root.right, sum - root.val)

image.png

3.运行结果

image.png

image.png

三.题后思考

关于二叉树的题目,深度优先和广度优先是最佳首选,其次就是利用hash或者栈的特点结合,也可以快速解决问题,另外还是没有找到之前动态二叉树的网站,估计已经没了,不然更加容易理解。