【一天一题—Day2】814. 二叉树剪枝

发布于:2023-02-18 ⋅ 阅读:(471) ⋅ 点赞:(0)


前往闪闪の小窝以获得更好的阅读评论体验

一、前景提要

今天在装修我的GitHub主页……嗯……也是很费时的一件事……
而且组好了双屏,向着tech otaku迈进一大步!

效果图:
效果图1
效果图2
效果图3

日后补上装修过程

重复补齐一下前景提要:

距离我尽量维持一天一题已经过去了一个月,整个6月份都在忙期末作业、期末复习和期末实训,放暑假后一直在打电动,在装修博客,导致我一天一题是鸽了又鸽,状态全无。

这让本就是菜鸡的我,又彻底变回纯飞舞,还是连题目都读不太懂的那种。

所以我决心恢复往日的状态。

往日荣光

二、题目

  1. 二叉树剪枝

难度:中等

给你二叉树的根结点 root ,此外树的每个结点的值要么是 0 ,要么是 1 。
返回移除了所有不包含 1 的子树的原二叉树。
节点 node 的子树为 node 本身加上所有 node 的后代。

示例1:
示例1

输入:root = [1,null,0,0,1]
输出:[1,null,0,null,1]
解释:
只有红色节点满足条件“所有不包含 1 的子树”。 右图为返回的答案。

示例2:
示例2

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

示例3:
示例3

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

提示:

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

三、解答

看到二叉树,第一反应就是想想能不能用回溯算法

题目的要求:如果有一个二叉树,他的子树里没有1,删掉这个二叉树

思路:一个点去往下找下一个点看看符不符合条件再往上返回,回溯(递归)算法的基操

1,回溯算法

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public TreeNode pruneTree(TreeNode root) {
        if(root == null) {
            return null;
        }
        //看看左子树
        root.left = pruneTree(root.left);
        //看看右子树
        root.right = pruneTree(root.right);
        //1,如果是叶子节点,左右子树都为null,自己本身的val又为0,那就返回null给父节点
        //2,如果不是叶子节点,自己的左右子树都返回null,也就意味着自己的子树里没有值为1的节点
        //	 然后自己如果val为0,那自己就是得被删的那棵树,也返回null
        if(root.left == null && root.right == null && root.val == 0) {
            return null;
        }
        //能走到这说明子树里有1或者
        //本身的值为1(如果为0的子树那早已经删掉了,也就是返回null值了)
        //此时正常返回即可,最终会返回最初的root节点
        return root;
    }
}

2,官方解法

之前做过剪枝的变种题,原题做起来还行
看看官方题解
一样
一样,那没事了。

本文含有隐藏内容,请 开通VIP 后查看