Skip to content

Latest commit

 

History

History
63 lines (45 loc) · 1.88 KB

File metadata and controls

63 lines (45 loc) · 1.88 KB

1110. Delete Nodes And Return Forest

Leetcode link

解题思路

本题要求我们 “去除” 二叉树中的某些点,然后按照任意顺序返回剩余的根结点们(就有点像是把一棵树砍了然后把树枝重新种下的感觉)


本题的难点主要在于,我们要怎么在遍历二叉树的同时把对应节点的引用处理好

首先我们会需要一个遍历函数 delNode,我们采取迭代的方式遍历

在遍历中,我们需要判断当前节点是否需要被删除:

  1. 如果不需要则正常遍历
  2. 如果需要,则要给当前节点的父节点返回 null;然后,在遍历到当前节点的子节点时,需要把他们加到返回的数组中

Javascript

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @param {number[]} to_delete
 * @return {TreeNode[]}
 */
var delNodes = function(root, to_delete) {
    const result = [];

    const delNode = (node, isRoot) => {
        if(!node) return null;
      	// 判断当前节点是否需要被删除
        const shouldDel = to_delete.includes(node.val);
      	// 如果当前节点的上个节点被删除,且当前节点需要保留,则判断当前节点是一个新的根结点,需要返回
        if(isRoot && !shouldDel) {
            result.push(node);
        }
      	// 正常遍历
        node.left = delNode(node.left, shouldDel);
        node.right = delNode(node.right, shouldDel);

      	// 如果当前节点被删除了,需要给当前节点父节点返回 null
        return shouldDel ? null : node;
    }

    delNode(root, true);

    return result;
};