共计 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 多平台公布