需要思考的问题
- 使用什么样的遍历顺序?先序、中序还是后序?
- 如何删除树中的节点?
如何解决上述问题
关于问题一: 对于一棵树,无非就是使用某一种遍历方法对它进行遍历并获取相应的结果。本题中我们选择后序遍历,因为后序遍历可以从叶子节点开始进行递归,这样子可以避免遗漏没有删除的节点。
关于问题二: 将节点的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
}