美文网首页
leetcode路径总和iii

leetcode路径总和iii

作者: HBYeah | 来源:发表于2018-05-24 02:24 被阅读0次

https://leetcode-cn.com/submissions/detail/2497483/
给定一个二叉树,它的每个结点都存放着一个整数值。
找出路径和等于给定数值的路径总数。
路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。
二叉树不超过1000个节点,且节点数值范围是 [-1000000,1000000] 的整数。

代码思路
       从根节点开始,将根节点的值放入列表中,向下遍历子节点,每遇到一个子节点,列表中元素都要加上子节点的值,然后列表追加子节点的值,分别得到从根节点到该子节点可能组合的和,从而寻找符合条件的路径。

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):
    def pathSum(self, root, sum_):
        """
        :type root: TreeNode
        :type sum: int
        :rtype: int
        """
        self.sum_=sum_
        self.mark = 0
        self.findPath(root,[])
        print(self.mark)   
        return self.mark
        
    def findPath(self,root,sums):
        if not root :
            return
        for i in range(len(sums)):
            sums[i]+=root.val
        sums.append(root.val)
        self.mark+=sums.count(self.sum_)

        self.findPath(root.left,sums[:])
        self.findPath(root.right,sums[:])

       网上找到一个cpp的列子,遍历所有节点,每个节点均要再次向下遍历路径,使用cpp运行确实很快,耗时15+ms,但按照这个思路改成python代码耗时飙升到1200+ms,难不成cpp效率能比python高近百倍,可惜不太懂cpp,没能按自己的思路改成cpp进行比较。
代码来源:https://blog.csdn.net/weixin_38368941/article/details/80296641

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    int pathSum(TreeNode* root, int sum) {
        int cnt = 0;
        dfs1(root, sum, cnt);
        return cnt;
        }
    //dfs用来计算二叉树中符合要求的路径的长度
    void dfs(TreeNode* root, int sum, int& cnt){
         if(root == NULL) return;
        //累计符合要求的路径个数
       if(root->val == sum) cnt++;
        dfs(root->left, sum-root->val, cnt);
        dfs(root->right, sum-root->val, cnt);
     }
    //用来遍历每个节点
    void dfs1(TreeNode* root, int sum, int& cnt){
         if(root == NULL) return;
        dfs(root, sum, cnt);
        dfs1(root->left, sum, cnt);
        dfs1(root->right, sum, cnt);
    }

};

相关文章

网友评论

      本文标题:leetcode路径总和iii

      本文链接:https://www.haomeiwen.com/subject/wshjjftx.html