zoukankan      html  css  js  c++  java
  • LeetCode_Path Sum II

    一.题目

    Path Sum II

      Total Accepted: 46778 Total Submissions: 175830My Submissions

    Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given sum.

    For example:
    Given the below binary tree and sum = 22,
                  5
                 / 
                4   8
               /   / 
              11  13  4
             /      / 
            7    2  5   1
    

    return

    [
       [5,4,11,2],
       [5,8,4,5]
    ]
    

    Show Tags
    Have you met this question in a real interview?  
    Yes
     
    No

    Discuss

















    二.解题技巧

        这道题和LeetCode_Path Sum类似,仅仅只是这道题须要找到全部和等于给定值的路径,因此不能在中间部分进行剪枝。必须遍历全然部的路径。

    这里面有一个技巧,在进入每个结点的时候。先将该结点的值push到vector中。在退出时间该结点的值pop出来,这样就能够避免有时会忘记pop结点的值的情况。

        这样的做法的时间复杂度为O(n),空间复杂度为O(logn)。


    三.实现代码

    #include <iostream>
    #include <vector>
    
    using std::vector;
    
    
    /**
    * Definition for a binary tree node.
    * struct TreeNode {
    *     int val;
    *     TreeNode *left;
    *     TreeNode *right;
    *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
    * };
    */
    
    
    struct TreeNode
    {
        int val;
        TreeNode *left;
        TreeNode *right;
        TreeNode(int x) : val(x), left(NULL), right(NULL) {}
    };
    
    
    class Solution
    {
    private:
        void pathSum(TreeNode* root, int sum, vector<vector<int> > &Result,
                             vector<int> &TmpResult)
        {
            if (!root)
            {
                return;
            }
    
            if (!root->left && !root->right && root->val == sum)
            {
                TmpResult.push_back(sum);
                Result.push_back(TmpResult);
    
                // pop the leaf node
                TmpResult.pop_back();
    
                return;
            }
    
            int SumChild = sum - root->val;
    
            TmpResult.push_back(root->val);
    
    
            pathSum(root->left, SumChild, Result, TmpResult);
            pathSum(root->right, SumChild, Result, TmpResult);
    
            // pop the current node
            TmpResult.pop_back();
        }
    
    public:
        vector<vector<int>> pathSum(TreeNode* root, int sum)
        {
            vector<vector<int> > Result;
            vector<int> TmpResult;
    
            pathSum(root, sum, Result, TmpResult);
    
            return Result;
    
        }
    };




    四.体会

        这道题和LeetCode_Path Sum类似,解法也是同样的吗。仅仅是不能进行剪枝而已。



    版权全部,欢迎转载。转载请注明出处,谢谢微笑





  • 相关阅读:
    【python学习笔记02】python的数据类型2
    元器件选型(一)ESD、TVS参考资料
    【python学习笔记01】python的数据类型
    你不知道的vue生命周期钩子选项(三)
    vue源码解析之选项合并(二)
    vue源码解析之选项合并(一)
    聊聊var与let 在window下面的区别(除开作用域)
    浅谈JavaScript中的防抖和节流
    Redhat6.4下安装Oracle10g
    Ubuntu Server 14.04 集成
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/5140038.html
Copyright © 2011-2022 走看看