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;
    }
};
相关推荐
karry_k8 小时前
MyBatis批量insert-select踩坑:useGeneratedKeys=true 可能让PostgreSQL返回大量插入结果
java·后端
karry_k8 小时前
PostgreSQL 在 MyBatis 中执行正常 SQL 失效:一次 DELETE USING 踩坑记录
java·后端
vibecoding日记9 小时前
双非如何快速入职字节等大厂大模型?真实案例分析:推理优化和投机解码
算法·求职·大模型工程师
yszaygr213811 小时前
Verilog参数化游程编码RLE模块
算法
SamDeepThinking11 小时前
从源码到代码:MyBatis-Flex 与 MyBatis-Plus 的逐项对比
java·后端·程序员
望易12 小时前
刚设计的大模型架构-双域耦合认知框架
算法·架构
她的男孩14 小时前
Spring Boot 接 Flowable 工作流:用 3 个注解搭一个请假审批流程
java·后端·架构
复杂网络16 小时前
多个 Claude Code 与多个 Codex 协同工作:设计与实现方案
算法
荣码16 小时前
LLM结构化输出:让AI返回JSON而不是废话,我踩了4个坑
java·python