码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • [100天算法】-二叉树剪枝(day 48)


    题目描述

    1. 给定二叉树根结点 root ,此外树的每个结点的值要么是 0,要么是 1。
    2. 返回移除了所有不包含 1 的子树的原二叉树。
    3. ( 节点 X 的子树为 X 本身,以及所有 X 的后代。)
    4. 示例1:
    5. 输入: [1,null,0,0,1]
    6. 输出: [1,null,0,null,1]
    7. 示例2:
    8. 输入: [1,0,1,0,0,0,1]
    9. 输出: [1,null,1,null,1]
    10. 示例3:
    11. 输入: [1,1,0,1,1,0,1,0]
    12. 输出: [1,1,0,1,1,null,1]
    13. 说明:
    14. 给定的二叉树最多有 100 个节点。
    15. 每个节点的值只会为 0 或 1 。
    16. 来源:力扣(LeetCode)
    17. 链接:https://leetcode-cn.com/problems/binary-tree-pruning
    18. 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    思路

    用【产品经理法】的思维来解决递归问题。

    产品

    假设我们已经有了一个 pruneTree 方法,可以把一棵树中不包含 1 的枝节删掉。

    子问题

    明显是 pruneTree(root.left) 和 pruneTree(root.right)。

    大小问题的关系

    首先,对于 root,我们用 pruneTree(root.left) 和 pruneTree(root.right) 的结果分别替换掉原本的 root.left 和 root.right。接着,再决定当前这棵树要不要保留。

    • 如果此时左右子树有一个不为空的话,那说明这棵树是要保留的,直接返回 root 就行。
    • 如果左右子树都为空,那我们就判断 root.val 的值,等于 1 就返回 root,等于 0 就返回 null 把这棵树移除。

    递归出口

    空节点直接返回 null 就行。

    代码

    TypeScript Code

    /**
     * Definition for a binary tree node.
     * class TreeNode {
     *     val: number
     *     left: TreeNode | null
     *     right: TreeNode | null
     *     constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
     *         this.val = (val===undefined ? 0 : val)
     *         this.left = (left===undefined ? null : left)
     *         this.right = (right===undefined ? null : right)
     *     }
     * }
     */
    
    function pruneTree(root: TreeNode | null): TreeNode | null {
        if (!root) return null;
    
        root.left = pruneTree(root.left);
        root.right = pruneTree(root.right);
    
        return root.left || root.right || root.val === 1 ? root : null;
    }

    复杂度分析

    • 时间复杂度:$O(N)$,N 为二叉树节点数。
    • 空间复杂度:$O(H)$,H 为二叉树的高度,递归栈的最大空间。
  • 相关阅读:
    C++中extern的使用
    docker使用nacos容器并且连接mysql容器
    如何将图片中的表格变成Excel?这几个操作很简单
    Java8 list.stream()操作使用心得
    pytorch中的model.eval()与volatile=True与requires_grad=False
    代码坏味道与重构之重复代码
    电脑磁盘大文件扫描工具WizTree下载、使用教程
    【Web 安全】刚开始学渗透,零基础怎么入门?
    【数字IC验证快速入门】10、Verilog RTL设计必会的FIFO
    MogaFX—乐观的通胀报告意味着美元刚刚经历了15年来最糟糕的一天
  • 原文地址:https://blog.csdn.net/xiaoshun007/article/details/134115280
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | 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号