思路:一个节点只有当它的值为0且它的左右子树值都为0时才需要把它删除(剪枝)。
class Solution {
public:
TreeNode* pruneTree(TreeNode* root) {
return containsOne(root) ? root : nullptr;
}
bool containsOne(TreeNode* root)
{
if (root == nullptr) return false;
bool left = containsOne(root->left); //递归向下查找
bool right = containsOne(root->right);
if (!left) root->left = nullptr; //若左子树或右子树为空
if (!right) root->right = nullptr; //则把该节点相应的子节点置空(剪枝)
return root->val == 1 || left || right; //三个条件若都不满足,则该节点会被删除
}
};