第一眼看见这个题我是想到回溯的,但是第二眼看上去又觉得怪怪的。
方法1 自底向上法
就是先遍历左子树遍历到叶子节点。 每遍历一个节点就把这个节点值加到和里面,这样到叶子节点时就已经有了左子树这条路径和。 然后判断这个路径和 与 target是否相等。
不相等就遍历右子树……
代码如下:
注意这里:
红色圈1处
不要写成了:
if(root->left==nullptr || root->right==nullptr) return false;
原因:
绿色圈2处:
不要写成了
dfs(root,root->left,target);
dfs(root,root->right,target);
因为我们每次走一个子节点都要把在原来的值上再加上这个节点的值,这个才是路径和,然后再去与target对比。 所以这里要写为:
dfs(root->left,sum+root->left->val,targetSum);
dfs(root->right,sum+root->right->val,targetSum);