我有两个关于问题Binary Tree Pruning的代码。
这是错误的代码
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;
}
};
我想知道是什么原因导致两个程序之间的差异
答案 0 :(得分:0)
在第二个代码中,确保同时调用text-align: left;
和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)
的求值结果为(root->left = pruneTree(root->left)) == NULL
,则不需要评估false
之后的分词,因为完整的表达式不再适用。