问题链接: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;
}
};
使用打印语句,我发现在找到要删除的节点后,它会删除它,然后停止递归并返回树。为什么要这样做?
答案 0 :(得分:2)
if ( ... )
为了使此 if
语句的计算结果为 true
,if
语句中的两个递归调用都必须返回 false。此 if
语句使用布尔 &&
运算符。在 C++ 中,布尔 &&
运算符要求其左侧和右侧表达式都为真,在这种情况下,只有在递归调用返回 false
时才会发生。如果任何递归调用返回 true
,则此 if
语句在逻辑上不可能计算为 true
。
当 if
语句为 false
时,下一个语句是:
return true;
因此,只要递归调用中的第一个 return
返回 true
,无论出于何种原因,所有正在进行的递归调用都必须导致调用 if
语句以结束评估为 if
的 false
语句,以及对 return true;
的相应递归调用。
游戏结束。