Leetcode 1110. 删点成林

72 阅读1分钟

题目连接

需要思考的问题

  1. 使用什么样的遍历顺序?先序、中序还是后序?
  2. 如何删除树中的节点?

如何解决上述问题

关于问题一: 对于一棵树,无非就是使用某一种遍历方法对它进行遍历并获取相应的结果。本题中我们选择后序遍历,因为后序遍历可以从叶子节点开始进行递归,这样子可以避免遗漏没有删除的节点。

关于问题二: 将节点的LeftNode或rightNode设置成nil。

示例代码

func delNodes(root *TreeNode, to_delete []int) []*TreeNode {
   if root == nil {
      return nil
   }
   delMap := make(map[int]bool)
   for _, val := range to_delete {
      delMap[val] = true
   }
   result := []*TreeNode{}

   var orderFunc func(node *TreeNode) *TreeNode

   orderFunc = func(node *TreeNode) *TreeNode {
      if node == nil {
         return nil
      }
      node.Left = orderFunc(node.Left)
      node.Right = orderFunc(node.Right)

      if delMap[node.Val] {
         if node.Left != nil {
            result = append(result, node.Left)
         }
         if node.Right != nil {
            result = append(result, node.Right)
         }

         node = nil
      }
      return node
   }

   orderFunc(root)

   if root != nil {
      result = append(result, root)
   }

   return result
}