bool hasPathSum(TreeNode *root, int sum) { if (root == nullptr)return false; if (root->left == nullptr && root->right == nullptr) return sum == root->val; return hasPathSum(root->left, sum - root->val) || hasPathSum(root->right, sum - root->val); }
第一题比较简单,递归完成。
第二题需要记录路径,因此当找到满足条件的左子树时,保存结果但不能返回,因为还需查看右子树。
vector<vector<int>>pathSum(TreeNode *root, int sum) { vector<vector<int>> result; vector<int> cur; pathSum(root, sum, cur, result); return result; } void pathSum(TreeNode *root, int gap, vector<int> &cur, vector<vector<int>> &result) { if (root == nullptr)return; cur.push_back(root->val);//先压入 //如果是叶子结点且满足条件,保留 if (root->left == nullptr && root->right == nullptr) { if (root->val == gap) result.push_back(cur); //此时还不能返回 } pathSum(root->left, gap - root->val, cur, result); pathSum(root->right, gap - root->val, cur, result); cur.pop_back();//注意弹出已经判断过的结点 }