为什么我的修剪二叉树的递归解决方案不起作用?
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
语句的计算结果为 true
,if
语句中的两个递归调用都必须 return 为假。此 if
语句使用布尔运算符 &&
。在 C++ 中,布尔运算符 &&
要求其左侧和右侧表达式都为真,在这种情况下,只有在递归调用 return false
时才会发生。如果任何递归调用 return true
则此 if
语句在逻辑上不可能计算为 true
.
下一个语句,当if
语句是false
时,是:
return true;
因此,一旦第一个 return
来自递归调用 returns true
,出于任何原因,所有正在进行的递归调用都必须导致调用 if
语句以 if
语句评估为 false
以及相应的对 return true;
的递归调用结束。
游戏结束。
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
语句的计算结果为 true
,if
语句中的两个递归调用都必须 return 为假。此 if
语句使用布尔运算符 &&
。在 C++ 中,布尔运算符 &&
要求其左侧和右侧表达式都为真,在这种情况下,只有在递归调用 return false
时才会发生。如果任何递归调用 return true
则此 if
语句在逻辑上不可能计算为 true
.
下一个语句,当if
语句是false
时,是:
return true;
因此,一旦第一个 return
来自递归调用 returns true
,出于任何原因,所有正在进行的递归调用都必须导致调用 if
语句以 if
语句评估为 false
以及相应的对 return true;
的递归调用结束。
游戏结束。