IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 力扣刷题 DAY_47 二叉树 -> 正文阅读

[数据结构与算法]力扣刷题 DAY_47 二叉树

Leetcode113

链接:力扣?

题目:

给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。

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

示例:

输入:root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22
输出:[[5,4,11,2],[5,8,4,5]]
解释:
5 + 4 + 11 + 2 = 22
5 + 8 + 4 + 5 = 22

思路:

与Leetcode112十分相似,但是本题需要找出所有路径。在112题中,其实暗含剪枝的思想。我们遍历的目的是为了到达叶结点并找到一条所需的路径。对于当前子树,只要左右孩子中发现了一条所需的路径,当前层就可以直接返回true,并如此反复将true传给最顶层。只要找到一条所需路径,后续所有到其他叶结点的遍历就可以中止直接向上层返回了,这样就减少了很多不需要的遍历。

而本题则需要老老实实将二叉树遍历完,找到所有所需路径。实际上,本题与257题基本相同,只需稍作修改即可。

依然使用递归的前序遍历思路。

用一个vector<vector<int> >数组result来记录最终答案,并用一个path数组记录当前已经走过的路径。

用前序遍历的方法。对于当前结点root,如果为空则return,若不为空,判断其是否为叶结点,如果非叶结点则将其加入path,并令sum与当前结点的val相加,依次递归进入其左子树和右子树,左右子树都递归完后还要从path里面删除该结点。

那么递归的边界在哪里呢?其实存在两个递归边界。

第一个边界就是当前结点为空时,直接return。

第二个边界就是当前访问结点为叶结点时,表示已经走完了一条路径,令sum与当前结点的val相加,判断其sum是否等于targetSum,如果相等将该叶结点加入path,然后将path全体加入加入result来记录一条结果。然后该叶结点从path里面删除。

参考代码:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:  
    void traversal (TreeNode *root, vector<int> &path,  int targetSum) {
        if (root == nullptr) {
            return;
        }
        path.push_back(root->val);
        if (root->left == nullptr && root->right == nullptr) {
            int sum = 0;
            for (int i = 0; i < path.size(); i++) {
                sum += path[i];
            }
            if (sum == targetSum) {
                result.push_back(path);
            }
        }
        else {
            traversal(root->left, path, targetSum);
            traversal(root->right, path, targetSum);
        }
        path.pop_back();
    }
    vector<vector<int>> pathSum(TreeNode* root, int targetSum) {
        vector<int> path;
        traversal(root, path, targetSum);
        return result;
    }
private:
    vector<vector<int> > result;
};
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-03-24 00:48:42  更:2022-03-24 00:52:30 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/9 1:48:04-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码