Fork me on GitHub

1110. 删点成林


这道题就只需把每个树的根节点存到数列里面即可
自己一开始的想法 通过一个函数 将遍历到的空点置为null然后保存 可问题出在添加到原本的root 居然里面的点还没改

所以做错了
进一步改进

leetcode找了最接近我的想法的代码

class Solution {
    public List<TreeNode> delNodes(TreeNode root, int[] to_delete) { 
        List<TreeNode> forest = new ArrayList<>(16);
        if (null == root) return forest;
        Set<Integer> toDeleteSet = new HashSet<>(16);
        for (int e : to_delete) {
            toDeleteSet.add(e);
        }
        root = delNodes(root, forest, toDeleteSet);
        if (null != root) forest.add(root);
        return forest;
    }
    // 思路
    // 如果是root待删除,则将其两个子指针 置空
    // 如果是中间某节点待删除,则将两个子指针置空,同时需要将其父节点指向自己的连接置空。
    // 递归解决。
    
    public TreeNode delNodes(TreeNode root, List<TreeNode> forest, Set<Integer> toDeleteSet) {
        if (null == root) return null;
        root.left = delNodes(root.left, forest, toDeleteSet);
        root.right = delNodes(root.right, forest, toDeleteSet);      
        if (toDeleteSet.contains(root.val)) {
            if (null != root.left&&!toDeleteSet.contains(root.left.val)) forest.add(root.left);
            if (null != root.right&&!toDeleteSet.contains(root.right.val))forest.add(root.right);
            return null;
        }
        return root;
    }
}
class Solution {
    
    public List<TreeNode> delNodes(TreeNode root, int[] to_delete) {

        List<TreeNode> res = new ArrayList<>();

        boolean[] del = new boolean[1001];
        for (int d : to_delete) {
            del[d] = true;
        }

        delete(root, null, true, del, res);

        return res;
    }

    private void delete(TreeNode root, TreeNode parent, boolean isLeft, boolean[] del, List<TreeNode> res) {
        
        if (root == null) {
            return ;
        }
        
        boolean isDelete = del[root.val];
        
        if (isDelete) {
            if (parent != null) {
                if (isLeft) {
                    parent.left = null;
                } else {
                    parent.right = null;
                }
            }
        } else {
            if (parent == null) {
                res.add(root);
            }
        }
        
        if (isDelete) {
            delete(root.left, null, true, del, res);
            delete(root.right, null, false, del, res);
        } else {
            delete(root.left, root, true, del, res);
            delete(root.right, root, false, del, res);
        }
    }
}
posted @ 2019-07-13 21:19  cznczai  阅读(309)  评论(0编辑  收藏  举报