Leetcode 1325. Delete Leaves With a Given Value (二叉树后序遍历经典题)

  1. Delete Leaves With a Given Value
    Solved
    Medium
    Topics
    Companies
    Hint
    Given a binary tree root and an integer target, delete all the leaf nodes with value target.

Note that once you delete a leaf node with value target, if its parent node becomes a leaf node and has the value target, it should also be deleted (you need to continue doing that until you cannot).

Example 1:

Input: root = [1,2,3,2,null,2,4], target = 2
Output: [1,null,3,null,4]
Explanation: Leaf nodes in green with value (target = 2) are removed (Picture in left).
After removing, new nodes become leaf nodes with value (target = 2) (Picture in center).
Example 2:

Input: root = [1,3,3,3,2], target = 3
Output: [1,3,null,null,2]
Example 3:

Input: root = [1,2,null,2,null,2], target = 2
Output: [1]
Explanation: Leaf nodes in green with value (target = 2) are removed at each step.

Constraints:

The number of nodes in the tree is in the range [1, 3000].
1 <= Node.val, target <= 1000

解法1:后序遍历!
注意:root = helper(root, target); 不能直接写成helper(root, target); 因为有可能root也被改成NULL。
参考case [1, 1, 1],这里的root也被清掉了。

/**
 * 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* removeLeafNodes(TreeNode* root, int target) {
        root = helper(root, target); //注意不能直接写成helper(root, target); 因为有可能root也被改成NULL。参考case [1, 1, 1]
        return root;
    }
private:
    TreeNode *helper(TreeNode *root, int target) {
        if (!root) return NULL;
        TreeNode *left = helper(root->left, target);
        TreeNode *right = helper(root->right, target);
        
        if (!left && !right && root->val == target) return NULL;
        root->left = left;
        root->right = right;
        return root;
    }
};

也可以直接写成:

class Solution {
public:
    TreeNode* removeLeafNodes(TreeNode* root, int target) {
        if (!root) return NULL;
        TreeNode *left = removeLeafNodes(root->left, target);
        TreeNode *right = removeLeafNodes(root->right, target);
        
        if (!left && !right && root->val == target) return NULL;
        root->left = left;
        root->right = right;
        return root;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值