题目链接:https://leetcode.cn/problems/binary-tree-pruning/
题目大意:给二叉树剪枝。节点的值只可能是0或1,将全为0的子树剪掉。
思路:递归做就行了。对于一个节点,无论其自身的值如何,都要先对左右子树进行判定&剪枝,因为即使自身的值是0,剪不剪也取决于左右子树。因此可以算是后序遍历。
节点自身值的区别在于,如果是1,返回时无脑返回自身就行;而如果是0,那么要看情况,如果左右子树也都是0,那么自己也得被剪掉,如果至少有一子树中有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* proc(TreeNode* node) {
if (node == nullptr) {
return nullptr;
}
TreeNode* p1 = proc(node->left);
TreeNode* p2 = proc(node->right);
if (p1 == nullptr) {
node->left = nullptr;
}
if (p2 == nullptr) {
node->right = nullptr;
}
if (node->val == 1) {
return node;
}
else { // node->val == 0
if (p1 == nullptr && p2 == nullptr)
return nullptr;
else
return node;
}
}
TreeNode* pruneTree(TreeNode* root) {
return proc(root);
}
};