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

Posted

技术标签:

【中文标题】为啥我的修剪二叉树的递归解决方案不起作用?【英文标题】:Why does my recursive solution to pruning binary tree not work?为什么我的修剪二叉树的递归解决方案不起作用? 【发布时间】:2021-10-01 10:04:42 【问题描述】:

问题链接: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】:
if (  ... )

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

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

 return true;

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

游戏结束。

【讨论】:

以上是关于为啥我的修剪二叉树的递归解决方案不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

二叉树及其作用浅析

二叉树的实验--二叉树的主要遍历算法

为啥这个 PHP 递归函数不起作用

使用 DFS 检查二叉树中是不是存在路径不起作用

二叉树面试题刷题模板(终极版)

为啥这个“数独求解器”算法不起作用