LeetCode 1110. Delete Nodes And Return Forest (二叉树构建非常好的题目!)

  1. Delete Nodes And Return Forest
    Medium

Given the root of a binary tree, each node in the tree has a distinct value.

After deleting all nodes with a value in to_delete, we are left with a forest (a disjoint union of trees).

Return the roots of the trees in the remaining forest. You may return the result in any order.

Example 1:

Input: root = [1,2,3,4,5,6,7], to_delete = [3,5]

Output: [[1,2,null,4],[6],[7]]

Example 2:

Input: root = [1,2,4,null,3], to_delete = [3]

Output: [[1,2,4]]

Constraints:

The number of nodes in the given tree is at most 1000.

Each node has a distinct value between 1 and 1000.

to_delete.length <= 1000

to_delete contains distinct values between 1 and 1000.

解法1:

个人感觉这是一道非常好的关于二叉树的构建的题目。

这题我感觉挺难的。我是参考的labuladong的做法。

  1. 只有当没有parent并且不被删除,就是res中一个新的TreeNode *
  2. 如果一个节点被删除了,我们不能直接返回NULL,因为还要处理其子节点。其子节点的hasParent都是false。
cpp 复制代码
/**
 * 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:
    vector<TreeNode*> delNodes(TreeNode* root, vector<int>& to_delete) {
        for (auto del : to_delete) {
            us.insert(del);
        }
        helper(root, false);
        return res;
    }
private:
    unordered_set<int> us;
    vector<TreeNode *> res;
    
    TreeNode * helper(TreeNode *root, bool hasParent) {
        if (!root) return NULL;
        bool toDelete = (us.find(root->val) != us.end());

        //没有parent并且不被删除,就是res中一个新的TreeNode *
        if (!toDelete && !hasParent) {
            res.push_back(root);
        }
        //if toDelete, the children's hasParent = false;
        root->left = helper(root->left, !toDelete);
        root->right = helper(root->right, !toDelete);
        return toDelete ? NULL : root;
    }
};
相关推荐
雨中飘荡的记忆9 小时前
ElasticJob分布式调度从入门到实战
java·后端
灵感__idea12 小时前
Hello 算法:众里寻她千“百度”
前端·javascript·算法
考虑考虑18 小时前
JDK25模块导入声明
java·后端·java ee
_小马快跑_19 小时前
Java 的 8 大基本数据类型:为何是不可或缺的设计?
java
Wect21 小时前
LeetCode 130. 被围绕的区域:两种解法详解(BFS/DFS)
前端·算法·typescript
Re_zero1 天前
线上日志被清空?这段仅10行的 IO 代码里竟然藏着3个毒瘤
java·后端
洋洋技术笔记1 天前
Spring Boot条件注解详解
java·spring boot
NAGNIP1 天前
一文搞懂深度学习中的通用逼近定理!
人工智能·算法·面试
程序员清风2 天前
程序员兼职必看:靠谱软件外包平台挑选指南与避坑清单!
java·后端·面试
皮皮林5512 天前
利用闲置 Mac 从零部署 OpenClaw 教程 !
java