1325. 删除给定值的叶子节点

给你一棵以 root 为根的二叉树和一个整数 target ,请你删除所有值为 target 的 叶子节点 。

注意,一旦删除值为 target 的叶子节点,它的父节点就可能变成叶子节点;如果新叶子节点的值恰好也是 target ,那么这个节点也应该被删除。

也就是说,你需要重复此过程直到不能继续删除。

 

 解答:

/**
 * 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) {
       if(root==NULL) return NULL;
        root->left = removeLeafNodes(root->left,target);
        root->right = removeLeafNodes(root->right,target);
        if(root->left==NULL&&root->right==NULL) {
            return root->val==target?NULL:root;
        }
        return root;
        
    }
};

 思考:由于我们需要删除所有值为 target 的叶子节点,那么我们的操作顺序应当从二叉树的叶子节点开始,逐步向上直到二叉树的根为止。因此我们可以使用递归的方法遍历整颗二叉树,并在回溯时进行删除操作。这样对于二叉树中的每个节点,它的子节点一定先于它被操作。这其实也就是二叉树的后序遍历。

具体地,当我们回溯到某个节点 u 时,如果 u 的左右孩子均不存在(这里有两种情况,一是节点 u 的孩子本来就不存在,二是节点 u 的孩子变成了叶子节点并且值为 target,导致其被删除),并且值为 target,那么我们要删除节点 u,递归函数的返回值为空节点;如果节点 u 不需要被删除,那么递归函数的返回值为节点 u 本身。


来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/delete-leaves-with-a-given-value
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

猜你喜欢

转载自www.cnblogs.com/pesuedream/p/13389576.html