[英]What are the problems in the following code?
我有关于二叉树修剪问题的代码。
这是一个错误的代码
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
则&&
之后的部分不需要计算,因为完整的表达式不能再变为真。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.