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

时间:2021-07-24 19:57:10

标签: c++ recursion binary-tree

问题链接:https://leetcode.com/problems/binary-tree-pruning/

基本上,给定二叉树的根,返回相同的树,其中每个不包含 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;
    }
    
};

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

1 个答案:

答案 0 :(得分:2)

if (  ... )

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

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

 return true;

因此,只要递归调用中的第一个 return 返回 true,无论出于何种原因,所有正在进行的递归调用都必须导致调用 if 语句以结束评估为 iffalse 语句,以及对 return true; 的相应递归调用。

游戏结束。