zoukankan      html  css  js  c++  java
  • 113. 路径总和 II

    113. 路径总和 II

    题目链接:113. 路径总和 II(中等)

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

    叶子节点 是指没有子节点的节点。

    示例 1:

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

    示例 2:

    输入:root = [1,2,3], targetSum = 5
    输出:[]

    示例 3:

    输入:root = [1,2], targetSum = 0
    输出:[]

    解题思路

    该题与112. 路径总和 类似,不一样的是该题需要遍历完所有的路径。

    递归法

    代码(C++)

    //递归
    class Solution {
    public:
        void traversal(TreeNode* node, vector<int>& path, vector<vector<int>>& result, int count) {
            if(!node->left && !node->right) {
                if (count == 0) result.push_back(path);
                return;
            }
            if (node->left) {
                path.push_back(node->left->val);
                count -= node->left->val;
                traversal(node->left, path, result, count); //递归
                count += node->left->val; //回溯
                path.pop_back(); //回溯
            }
            if (node->right) {
                path.push_back(node->right->val);
                count -= node->right->val;
                traversal(node->right, path, result, count); //递归
                count += node->right->val; //回溯
                path.pop_back(); //回溯
            }
        }
        vector<vector<int>> pathSum(TreeNode* root, int targetSum) {
            vector<vector<int>> result;
            if (root == nullptr) return result;
            vector<int> path;
            path.push_back(root->val);
            traversal(root, path, result, targetSum - root->val);
            return result;
        }
    };

    代码(JavaScript)

    /**
     * @param {TreeNode} root
     * @param {number} targetSum
     * @return {number[][]}
     */
    function traversal(node, path, result, count) {
        if (!node.left && !node.right) {
            if (count === 0) result.push([...path]); // 不能写result.push(path), 要深拷贝
            return;
        }
    ​
        if (node.left) {
            path.push(node.left.val);
            count -= node.left.val;
            traversal(node.left, path, result, count); //递归
            count += node.left.val; //回溯
            path.pop(); //回溯
        }
        if (node.right) {
            path.push(node.right.val);
            count -= node.right.val;
            traversal(node.right, path, result, count); //递归
            count += node.right.val; //回溯
            path.pop(); //回溯
        }
        return false;
    }
    ​
    var pathSum = function(root, targetSum) {
        let result = [];
        if (root === null) return result;
        let path = [];
        path.push(root.val);
        traversal(root, path, result, targetSum - root.val);
        return result;
    };
  • 相关阅读:
    Angular常用VSCode插件
    asp.net MVC设计模式中使用iTextSharp实现html字符串生成PDF文件
    Docker Compose部署 EFK(Elasticsearch + Fluentd + Kibana)收集日志
    强烈推荐这本书《编码:隐匿在计算机软硬件背后的语言》
    frp 内网穿透访问内网Web服务
    代码玄学——镇代码的注释
    C#基础之多线程与异步
    C#基础之事件(1)
    WPF之Unity与ServiceLocator运用
    WPF之实现控件内容拖动
  • 原文地址:https://www.cnblogs.com/wltree/p/15669547.html
Copyright © 2011-2022 走看看