题目难度: 中等
原题链接
今天继续更新 Leetcode 的剑指 Offer(专项突击版)系列, 大家在公众号 算法精选 里回复
剑指offer2
就能看到该系列当前连载的所有文章了, 记得关注哦~
给定一个二叉树 根节点 root ,树的每个节点的值要么是 0,要么是 1。请剪除该二叉树中所有节点的值为 0 的子树。
节点 node 的子树为 node 本身,以及所有 node 的后代。
node.val==0 && leftAllZero && rightAllZero
, 返回它即可class Solution:
def pruneTree(self, root: TreeNode) -> TreeNode:
# 使用哨兵节点, 将其左子节点指向root, 并从哨兵开始判断
# 因为有可能整个树都是0, 此时需要返回空节点, 如果不用哨兵从root开始判断, 就需要额外的逻辑特殊处理root
dummy = TreeNode(0, root)
def allZero(node):
if not node:
# 递归出口, 空节点的值不是1, 所以返回True
return True
leftAllZero = allZero(node.left)
rightAllZero = allZero(node.right)
if leftAllZero:
# 左子树全为0, 断开当前节点与其的连接
node.left = None
if rightAllZero:
# 右子树全为0, 断开当前节点与其的连接
node.right = None
# 当前子树全为0需要满足: 当前节点值为0 && 左子树全为0 && 右子树全为0
return node.val == 0 and leftAllZero and rightAllZero
allZero(dummy)
# 最终哨兵节点的左子节点即为删除全0子树后的根节点 (可能为空)
return dummy.left
大家可以在下面这些地方找到我~
我的 GitHub
我的 Leetcode
我的 CSDN
我的知乎专栏
我的头条号
我的牛客网博客
我的公众号: 算法精选, 欢迎大家扫码关注~