关于后端:814-二叉树剪枝-简单递归运用题

1次阅读

共计 1415 个字符,预计需要花费 4 分钟才能阅读完成。

题目形容

这是 LeetCode 上的 814. 二叉树剪枝 ,难度为 中等

Tag :「二叉树」、「DFS」、「递归」

给你二叉树的根结点 root,此外树的每个结点的值要么是 $0$,要么是 $1$。

返回移除了所有不蕴含 $1$ 的子树的原二叉树。

节点 node 的子树为 node 自身加上所有 node 的后辈。

示例 1:

输出:root = [1,null,0,0,1]

输入:[1,null,0,null,1]

解释:只有红色节点满足条件“所有不蕴含 1 的子树”。右图为返回的答案。

示例 2:

输出:root = [1,0,1,0,0,0,1]

输入:[1,null,1,null,1]

示例 3:

输出:root = [1,1,0,1,1,0,1,0]

输入:[1,1,0,1,1,null,1]

提醒:

  • 树中节点的数目在范畴 $[1, 200]$ 内
  • Node.val 为 $0$ 或 $1$

递归

依据题意,咱们将原函数 pruneTree 作为递归函数,递归函数的含意为「将入参 root 中的所有不蕴含 $1$ 的子树移除,并返回新树头结点」。

不失一般性的思考任意节点作为入参该如何解决:咱们能够递归解决左右子树,并将新左右子树从新赋值给 root。因为以后节点 root 的左右子树可能为空树,因而咱们要减少递归函数入参为空的边界解决。

当递归操作实现后,若左右节点任一值不为空(阐明以后节点 root 不为叶子节点),咱们能够间接返回 root,否则依据 root 的值是否为 $0$ 来决定返回空树还是 root 自身。

Java 代码:

class Solution {public TreeNode pruneTree(TreeNode root) {if (root == null) return null;
        root.left = pruneTree(root.left);
        root.right = pruneTree(root.right);
        if (root.left != null || root.right != null) return root;
        return root.val == 0 ? null : root;
    }
}

TypeScript 代码:

function pruneTree(root: TreeNode | null): TreeNode | null {if (root == null) return null
    root.left = pruneTree(root.left)
    root.right = pruneTree(root.right)
    if (root.left != null || root.right != null) return root
    return root.val == 0 ? null : root
};
  • 工夫复杂度:$O(n)$
  • 空间复杂度:疏忽递归带来的额定空间开销,复杂度为 $O(1)$

最初

这是咱们「刷穿 LeetCode」系列文章的第 No.814 篇,系列开始于 2021/01/01,截止于起始日 LeetCode 上共有 1916 道题目,局部是有锁题,咱们将先把所有不带锁的题目刷完。

在这个系列文章外面,除了解说解题思路以外,还会尽可能给出最为简洁的代码。如果波及通解还会相应的代码模板。

为了不便各位同学可能电脑上进行调试和提交代码,我建设了相干的仓库:https://github.com/SharingSou…。

在仓库地址里,你能够看到系列文章的题解链接、系列文章的相应代码、LeetCode 原题链接和其余优选题解。

更多更全更热门的「口试 / 面试」相干材料可拜访排版精美的 合集新基地 🎉🎉

本文由 mdnice 多平台公布

正文完
 0