在链表/二叉树的遍历过程中,经常需要在while上判断p->next或p是否为空,那么到底什么时候用if(!p->next),什么时候用if(!p)?
首先这二者的区别是,if(!p->next)会使p指针停留在最后一个有效节点上,而if(!p)会使p指针指向尾节点的下一个NULL上
也就是说,如果我想要操作叶子节点(路径总和),就使用前者;如果我只想用NULL作为终止条件的标志(比如y总的大部分全排列模板),就使用后者
力扣112 路径总和
https://leetcode.cn/problems/path-sum/
class Solution {
public:
bool flag = false;
bool hasPathSum(TreeNode* root, int targetSum) {
if (!root)
return false;
dfs(root, targetSum);
return flag;
}
void dfs(TreeNode* root, int sum) {
//if (!root)
// return; // 没有也行,因为上面下面的三个if都帮助处理了
sum = sum - root->val; // 属于根左右的处理方式,当前先扣val值
if (!root->left && !root->right && sum == 0) // 终止条件:为叶子节点且sum为0
flag = true;
if (root->left)
dfs(root->left, sum);
if (root->right)
dfs(root->right, sum);
}
};