为什么我的修剪二叉树的递归解决方案不起作用?

Why does my recursive solution to pruning binary tree not work?

Link 提问:https://leetcode.com/problems/binary-tree-pruning/

基本上,给定一棵二叉树的根,return 同一棵树,其中(给定树的)不包含 1 的每个子树都已被删除。

我的代码:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    TreeNode* pruneTree(TreeNode* root) {
        recurse(root);
        return root;
    }
    
    bool recurse(TreeNode* &root) {
        if (root == nullptr)
            return false;
        cout<<"val: "<<root->val<<" ";

        if (recurse(root->left) == false && recurse(root->right) == false && root->val==0)
        {
            root = nullptr;
            return false;
        }
        return true;
    }
    
};

使用 print 语句,我发现在找到一个要删除的节点后,它会删除它,然后停止递归并 return 树。为什么要这样做?

if (  ... )

为了使此 if 语句的计算结果为 trueif 语句中的两个递归调用都必须 return 为假。此 if 语句使用布尔运算符 &&。在 C++ 中,布尔运算符 && 要求其左侧和右侧表达式都为真,在这种情况下,只有在递归调用 return false 时才会发生。如果任何递归调用 return true 则此 if 语句在逻辑上不可能计算为 true.

下一个语句,当if语句是false时,是:

 return true;

因此,一旦第一个 return 来自递归调用 returns true,出于任何原因,所有正在进行的递归调用都必须导致调用 if 语句以 if 语句评估为 false 以及相应的对 return true; 的递归调用结束。

游戏结束。