814 二叉树剪枝(利用递归调用返回的结果来删除节点)
发布日期:2021-05-07 21:55:27 浏览次数:21 分类:精选文章

本文共 1420 字,大约阅读时间需要 4 分钟。

对于这个问题,我们需要移除所有不包含1的子树。我们可以使用递归的方法来解决这个问题。递归的思路是从叶子节点开始,逐层向上判断每个节点是否需要保留。具体步骤如下:

  • 检查当前节点是否为叶子节点:如果是叶子节点,检查其值。如果是0,则移除该子树;如果是1,则保留。
  • 递归处理左、右子树:如果当前节点不是叶子节点,递归处理左子树和右子树。如果左子树被移除,设置左子树为null;同样处理右子树。
  • 决定当前节点是否保留:根据左、右子树的返回值和当前节点的值,决定是否保留当前节点。如果当前节点为0,且左、右子树都被移除,则当前节点也被移除。
  • 以下是代码实现:

    class TreeNode:
    def __init__(self, val=0, left=None, right=None):
    self.val = val
    self.left = left
    self.right = right
    class Solution:
    def delete(self, root: TreeNode):
    if not root:
    return True
    is_leaf = not root.left and not root.right
    if is_leaf:
    return root.val == 0
    left_deleted = self.delete(root.left)
    right_deleted = self.delete(root.right)
    if left_deleted:
    root.left = None
    if right_deleted:
    root.right = None
    # Determine if current node should be deleted
    if root.val == 0 and left_deleted and right_deleted:
    return True
    return False
    def pruneTree(self, root: TreeNode) -> TreeNode:
    if not self.delete(root):
    return None
    return root

    代码解释

  • TreeNode类:定义了二叉树的节点结构,每个节点有一个值,以及左、右子节点。
  • delete方法:使用递归来判断是否需要移除当前节点及其子树。返回布尔值表示是否移除了该子树。
    • 检查是否为叶子节点:如果是叶子节点,返回值是否为0。
    • 递归处理左、右子树:处理左子树和右子树,根据返回值决定是否将左、右子树设为null。
    • 判断当前节点是否保留:如果当前节点为0且左右子树都被移除,则当前节点也被移除。
  • pruneTree方法:调用delete方法,并根据返回值处理根节点。如果根节点被移除,返回None,否则返回根节点。
  • 这种方法确保了每个节点都被正确处理,移除了所有不包含1的子树,符合题目要求。

    上一篇:1640 能否连接形成数组(字典记录数字出现的位置)
    下一篇:450 删除二叉搜索树中的节点(递归删除节点)

    发表评论

    最新留言

    初次前来,多多关照!
    [***.217.46.12]2025年03月22日 10时26分59秒