@@ -1006,6 +1006,63 @@ func traversal(_ cur: TreeNode?, count: Int) {
1006
1006
}
1007
1007
```
1008
1008
1009
+ ## C
1010
+ 0112.路径总和
1011
+ 递归法:
1012
+ ``` c
1013
+ bool hasPathSum (struct TreeNode* root, int targetSum){
1014
+ // 递归结束条件:若当前节点不存在,返回false
1015
+ if(!root)
1016
+ return false;
1017
+ // 若当前节点为叶子节点,且targetSum-root的值为0。(当前路径上的节点值的和满足条件)返回true
1018
+ if(!root->right && !root->left && targetSum == root->val)
1019
+ return true;
1020
+
1021
+ // 查看左子树和右子树的所有节点是否满足条件
1022
+ return hasPathSum(root->right, targetSum - root->val) || hasPathSum(root->left, targetSum - root->val);
1023
+ }
1024
+ ```
1025
+
1026
+ 迭代法:
1027
+ ```c
1028
+ // 存储一个节点以及当前的和
1029
+ struct Pair {
1030
+ struct TreeNode* node;
1031
+ int sum;
1032
+ };
1033
+
1034
+ bool hasPathSum(struct TreeNode* root, int targetSum){
1035
+ struct Pair stack[1000];
1036
+ int stackTop = 0;
1037
+
1038
+ // 若root存在,则将节点和值封装成一个pair入栈
1039
+ if(root) {
1040
+ struct Pair newPair = {root, root->val};
1041
+ stack[stackTop++] = newPair;
1042
+ }
1043
+
1044
+ // 当栈不为空时
1045
+ while(stackTop) {
1046
+ // 出栈栈顶元素
1047
+ struct Pair topPair = stack[--stackTop];
1048
+ // 若栈顶元素为叶子节点,且和为targetSum时,返回true
1049
+ if(!topPair.node->left && !topPair.node->right && topPair.sum == targetSum)
1050
+ return true;
1051
+
1052
+ // 若当前栈顶节点有左右孩子,计算和并入栈
1053
+ if(topPair.node->left) {
1054
+ struct Pair newPair = {topPair.node->left, topPair.sum + topPair.node->left->val};
1055
+ stack[stackTop++] = newPair;
1056
+ }
1057
+ if(topPair.node->right) {
1058
+ struct Pair newPair = {topPair.node->right, topPair.sum + topPair.node->right->val};
1059
+ stack[stackTop++] = newPair;
1060
+ }
1061
+ }
1062
+ return false;
1063
+ }
1064
+ ```
1065
+
1009
1066
1010
1067
1011
1068
-----------------------
0 commit comments