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;
    }
};
相关推荐
m沐沐4 小时前
【深度学习】YOLOv2目标检测算法——改进点、网络结构与聚类先验框解析
人工智能·pytorch·深度学习·算法·yolo·目标检测·transformer
不会就选b4 小时前
算法日常・每日刷题--<链表>3
数据结构·算法·链表
geovindu4 小时前
go: Iterative Algorithms
开发语言·后端·算法·golang·迭代算法
前端工作日常6 小时前
我学习到的Java中domain和dto区别
java·后端
码农学院6 小时前
基于Spring Boot的跨境电商多语言订单管理系统架构设计
java·大数据·spring boot
Zachery Pole6 小时前
CCF-CSP备战NO.7【队列】
算法
闪电悠米7 小时前
力扣hot100-48.旋转图像-转置翻转详解
算法·leetcode·职场和发展
技术小结-李爽7 小时前
【工具】pom文件的<packaging>
java·maven
满天星83035777 小时前
【算法】最长递增子序列(三种解法)
算法
l156469487 小时前
突围!图文混合知识库难以解析,Kimi-K3 原生视觉架构深耕知识工作,DMXAPI 统一接口,缩短项目开发周期
java·大数据·开发语言