问题
路径总和 III 原题链接:https://leetcode.cn/problems/path-sum-iii?envType=study-plan-v2&envId=top-100-liked
解法
第一种方法就是直接暴力,整体思路就是对树中所有节点遍历一遍(先序、中序、后序、层次遍历等都行),挨个深搜。时间复杂度为O(N^2),其中 N 为该二叉树节点的个数。代码如下:
class Solution { public: int ans=0; void dfs(TreeNode* root,long long targetSum){ if(!root) return; long long temp=targetSum-root->val; if(temp==0){ ans++; } if(root->left!=nullptr) dfs(root->left,temp); if(root->right!=nullptr) dfs(root->right,temp); } int pathSum(TreeNode* root, int targetSum) { if(!root) return 0; stack<TreeNode*> stk; stk.push(root); TreeNode* node=root; while(!node || !stk.empty()){ while(node){ dfs(node,targetSum); stk.push(node->right); node=node->left; } node=stk.top();stk.pop(); } return ans; } };
|
第二种方法运用前缀和优化,通过在探索一条路(从根到叶)时记录他的前缀和避免了多次访问一个节点,将时间复杂度从O(N^2)优化到O(N),其中 N 为该二叉树节点的个数。代码如下:
class Solution { public: unordered_map<long long,int> mp; int dfs(TreeNode* root,long long cur,int targetSum){ if(!root) return 0;
int ret=0; cur+=root->val;
if(mp.count(cur-targetSum)) ret=mp[cur-targetSum]; mp[cur]++;
ret+=dfs(root->left,cur,targetSum); ret+=dfs(root->right,cur,targetSum); mp[cur]--;
return ret; } int pathSum(TreeNode* root, int targetSum) { mp[0]=1; return dfs(root,0,targetSum); } };
|