我对单个if语句中的条件或条件有一个基本的疑问。假设l和r是指向树节点的指针,在其中任何一个指针变为空的情况下,评估检查行并返回false。我想知道的是,当l或r中的任何一个变为null时,不应该为同一if语句中的第三个条件引发空指针异常吗?如果我将第三个条件作为第一个条件放置,则引发异常。有人可以突出显示在每种情况下如何评估两个语句(第二个语句作为注释被提及)?
bool isSymmetric(TreeNode* root) {
queue<TreeNode*>q;
if (root == NULL)
return true;
q.push(root->left);
q.push(root->right);
TreeNode *l, *r;
while (!q.empty())
{
l = q.front();
q.pop();
r = q.front();
q.pop();
if (l == NULL && r == NULL)
continue;
if (l == NULL || r == NULL || l->val != r->val) return false; //check
// if (l->val != r->val || l == NULL || r == NULL)
q.push(l->left);
q.push(r->right);
q.push(l->right);
q.push(r->left);
}
return true;
}
答案 0 :(得分:1)
真的很可爱。 (我正在用NULL
替换前C ++ 11 nullptr
。)
continue
和 l
都是r
,则会调用 nullptr
。
由于||
已被短路,l->val != r->val
仅在l
不是nullptr
和 r
时才会被评估不是nullptr
。
你需要习惯于在C ++中习惯这样的习语,作为你熟练使用该语言的一部分。
请注意,解除引用 nullptr
上的行为在C ++中是 undefined ;不一定抛出异常。在谈论标准C ++时,不要谈论空指针异常。
最后,您可以将功能更改为const TreeNode* root
吗?