繁体   English   中英

以下代码有什么问题?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM