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;
    }
};
相关推荐
市场部需要一个软件开发岗位4 小时前
JAVA开发常见安全问题:纵向越权
java·数据库·安全
大闲在人4 小时前
8. 供应链与制造过程术语:产能
算法·制造·供应链管理·智能制造·工业工程
一只小小的芙厨4 小时前
寒假集训笔记·以点为对象的树形DP
c++·算法
历程里程碑4 小时前
普通数组----合并区间
java·数据结构·python·算法·leetcode·职场和发展·tornado
执风挽^4 小时前
Python基础编程题2
开发语言·python·算法·visual studio code
程序员泠零澪回家种桔子4 小时前
Spring AI框架全方位详解
java·人工智能·后端·spring·ai·架构
Z9fish4 小时前
sse哈工大C语言编程练习20
c语言·开发语言·算法
CodeCaptain4 小时前
nacos-2.3.2-OEM与nacos3.1.x的差异分析
java·经验分享·nacos·springcloud
晓13135 小时前
第六章 【C语言篇:结构体&位运算】 结构体、位运算全面解析
c语言·算法
iAkuya5 小时前
(leetcode)力扣100 61分割回文串(回溯,动归)
算法·leetcode·职场和发展