C++ 以下代码?;
关于这个问题,我有两个代码。C++ 以下代码?;,c++,C++,关于这个问题,我有两个代码。 这是一个错误的代码 class Solution { public: TreeNode* pruneTree(TreeNode* root) { if(root == NULL) return NULL; if((root->left = pruneTree(root->left)) == NULL && (root->right = pruneT
这是一个错误的代码
class Solution {
public:
TreeNode* pruneTree(TreeNode* root) {
if(root == NULL)
return NULL;
if((root->left = pruneTree(root->left)) == NULL &&
(root->right = pruneTree(root->right)) == NULL){
if(root->val == 0){
delete root;
return NULL;
}
}
return root;
}
};
这是我传递的代码
class Solution {
public:
TreeNode* pruneTree(TreeNode* root) {
if(root == NULL)
return NULL;
root->left = pruneTree(root->left);
root->right = pruneTree(root->right);
if(root->left == NULL && root->right == NULL){
if(root->val == 0){
delete root;
return NULL;
}
}
return root;
}
};
我想知道是什么原因导致这两个程序之间的差异在第二个代码中,保证调用
pruneTree(root->left)
和pruneTree(root->right)
,因为这是两个独立的表达式
root->left = pruneTree(root->left);
root->right = pruneTree(root->right);
在第一个代码中,您有:
(root->left = pruneTree(root->left)) == NULL &&
(root->right = pruneTree(root->right)) == NULL
这里的区别在于pruneTree(root->left)
和pruneTree(root->right)
在一个表达式中,因此它们可能(在本例中是do)相互依赖
如果
(root->left=pruneTree(root->left))==NULL
的计算结果为false
,则不需要计算&
后面的部分,因为完整表达式不能再变为true。如果left为NULL,则第一个表达式不会向右修剪。请阅读关于短路的内容。