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);
}
};