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


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

一、前景提要

今天在装修我的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,官方解法

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

1. 二叉树的递归遍历: 二叉树的递归遍历是指通过递归方法遍历二叉树的各个节点,按照某种次序访问每个节点。常见的二叉树遍历方式有前序遍历、中序遍历和后序遍历。 2. 二叉树的非递归遍历: 二叉树的非递归遍历是指通过循环等非递归方法遍历二叉树的各个节点,按照某种次序访问每个节点。非递归遍历需要借助栈来实现,常见的二叉树遍历方式有前序遍历、中序遍历和后序遍历。 3. 二叉树的层次遍历: 二叉树的层次遍历是指按照从上到下、从左到右的顺序遍历每一层节点。常用的方法是使用队列来实现,首先将根节点入队列,然后依次出队列,并将其左右子节点入队列,直到队列为空。 4. 输出二叉树上所有叶节点: 二叉树上的叶节点是指没有子节点的节点。可以通过递归方式,对每个节点进行判断,如果该节点没有左右子节点,则将该节点输出。 5. 求二叉树的高度: 二叉树的高度是指从根节点到叶节点最长路径上经过的边数。可以通过递归方式求解,从左右子树中选取较大的一个加上根节点即可。 6. 二叉树层序生成算法二叉树层序生成算法是指按照从上到下、从左到右的顺序依次生成每个节点。可以使用队列来实现,首先将根节点入队列,然后依次出队列,并根据当前节点生成其左右子节点,将其入队列,直到生成完所有节点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值