码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 二叉树题目:二叉树剪枝


    文章目录

    • 题目
      • 标题和出处
      • 难度
      • 题目描述
        • 要求
        • 示例
        • 数据范围
    • 解法
      • 思路和算法
      • 代码
      • 复杂度分析

    题目

    标题和出处

    标题:二叉树剪枝

    出处:814. 二叉树剪枝

    难度

    4 级

    题目描述

    要求

    给定二叉树的根结点 root \texttt{root} root,返回移除了所有不包含 1 \texttt{1} 1 的子树的原二叉树。

    结点 node \texttt{node} node 的子树为 node \texttt{node} node 本身以及所有 node \texttt{node} node 的后代。

    示例

    示例 1:

    示例 1

    输入: root   =   [1,null,0,0,1] \texttt{root = [1,null,0,0,1]} root = [1,null,0,0,1]
    输出: [1,null,0,null,1] \texttt{[1,null,0,null,1]} [1,null,0,null,1]
    解释:
    只有红色结点满足条件「所有不包含 1 \texttt{1} 1 的子树」。右图为返回的答案。

    示例 2:

    示例 2

    输入: root   =   [1,0,1,0,0,0,1] \texttt{root = [1,0,1,0,0,0,1]} root = [1,0,1,0,0,0,1]
    输出: [1,null,1,null,1] \texttt{[1,null,1,null,1]} [1,null,1,null,1]

    示例 3:

    示例 3

    输入: root   =   [1,1,0,1,1,0,1,0] \texttt{root = [1,1,0,1,1,0,1,0]} root = [1,1,0,1,1,0,1,0]
    输出: [1,1,0,1,1,null,1] \texttt{[1,1,0,1,1,null,1]} [1,1,0,1,1,null,1]

    数据范围

    • 树中结点数目在范围 [1,   200] \texttt{[1, 200]} [1, 200] 内
    • Node.val \texttt{Node.val} Node.val 是 0 \texttt{0} 0 或 1 \texttt{1} 1

    解法

    思路和算法

    如果二叉树为空,则不需要执行剪枝操作,直接返回即可。

    当二叉树不为空时,需要首先对二叉树的左子树和右子树执行剪枝操作,然后对当前二叉树执行剪枝操作。剪枝操作具体为,如果一个结点是叶结点且结点值为 0 0 0,则该结点被移除。注意在移除值为 0 0 0 的叶结点之后,被移除的结点的父结点可能从非叶结点变成叶结点。

    由于每个结点是否需要被移除和结点的子树有关,因此可以使用深度优先搜索实现。

    整个过程是一个递归的过程。递归的终止条件是当前结点为空,或者当前结点是叶结点且结点值为 0 0 0,这两种情况都返回空二叉树。对于其余情况,递归地对左子树和右子树执行剪枝操作。

    由于剪枝操作只会移除所有的值为 0 0 0 的叶结点(包括从非叶节点变成叶结点的值为 0 0 0 的结点),不会移除值为 1 1 1 的结点,因此剪枝操作可以确保移除所有不包含 1 1 1 的子树。

    代码

    class Solution {
        public TreeNode pruneTree(TreeNode root) {
            if (root == null) {
                return root;
            }
            root.left = pruneTree(root.left);
            root.right = pruneTree(root.right);
            if (root.left == null && root.right == null && root.val == 0) {
                root = null;
            }
            return root;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    复杂度分析

    • 时间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉树的结点数。每个结点都被访问一次。

    • 空间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉树的结点数。空间复杂度主要是递归调用的栈空间,取决于二叉树的高度,最坏情况下二叉树的高度是 O ( n ) O(n) O(n)。

  • 相关阅读:
    TypeScript核心篇——类(class)-可选参数-存取器-构造函数-静态属性方法-抽象类
    17.webpack4优化配置介绍
    【算法】使数组有序的最小交换次数
    mysql的数据库、表、字段、数据操作sql
    阿里云新用户滑块验证不过,阿里云滑动验证流程及线上问题排查
    云原生之深入解析Prometheus Pushgetway的原理分析和实战操作
    RepGhost
    2022年最新uniapp学习,从零基础到实战项目,unicloud数据后台快速打造uniapp小程序项目
    最通俗易懂的LSTM讲解,一个例子理解通透!!
    微信小程序标题栏封装
  • 原文地址:https://blog.csdn.net/stormsunshine/article/details/122763738
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号