力扣 - 814. 二叉树剪枝
题目
思路
- 就是先从最后一层叶子节点开始判断,将左右子树的结果反馈给父节点,让父节点做出判断
- 根据这个思路我们可以利用二叉树的后序遍历来实现:
- 后序遍历就是先左孩子,然后右孩子,最后父节点
- 父节点的判断条件就是:父节点本身的值是否为1、左孩子是否为存在1、右孩子是否存在1.这三者只要满住一个就可以了
- 同时,在pruneTree函数中,我们返回的结果也要做一个判断,如果整颗数都是0,那么返回false,否则返回根节点root
代码
class Solution {
public TreeNode pruneTree(TreeNode root) {
// 判断搜索的结果是什么,如果false就返回null,否则返回root
return search(root) ? root : null;
}
private boolean search(TreeNode root) {
if (root == null) {
return false;
}
// 后序遍历
boolean left = search(root.left);
boolean right = search(root.right);
if (left == false) {
root.left = null;
}
if (right == false) {
root.right = null;
}
return root.val == 1 || left || right;
}
}
复杂度分析
- 时间复杂度:\(O(N)\),其中 N 为节点的个数
- 空间复杂度:\(O(H)\),其中 H 为树的高度
我走得很慢,但我从不后退!

浙公网安备 33010602011771号