【二叉树】Leetcode 114. 二叉树展开为链表【中等】

二叉树展开为链表

给你二叉树的根结点 root ,请你将它展开为一个单链表:

  • 展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。
  • 展开后的单链表应该与二叉树 先序遍历 顺序相同。

示例1:
在这里插入图片描述
输入:root = [1,2,5,3,4,null,6]
输出:[1,null,2,null,3,null,4,null,5,null,6]

解题思路

展开二叉树为单链表可以使用前序遍历的方式来实现。

  • 1、对于当前节点,首先将其左子树展开为单链表,并将左子树的最右节点连接到当前节点的右子树上。
  • 2、然后将当前节点的右子树展开为单链表。
  • 3、如果左子树不为空,将当前节点的右子树设为展开后的左子树;否则,将左子树设为右子树。

Java实现

public class FlattenBinaryTreeToLinkedList {

    static class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;
        TreeNode(int val) {
            this.val = val;
        }
    }

    public void flatten(TreeNode root) {
        if (root == null) {
            return;
        }

        flattenHelper(root);
    }

    private TreeNode flattenHelper(TreeNode node) {
        if (node == null) {
            return null;
        }
        //    1
        //   / \
        //  2   5
        // / \   \
        //3   4   6
        // 把2的右子树4放到2的左子树3的右子树上
        //      1
        //     / \
        //    2   5
        //   / \   \
        //  3   4   6
        //   \
        //    4
        //把2左子树3-4移到右子树下,把2的左子树置空
        //      1
        //     / \
        //    2   5
        //     \   \
        //      3   6
        //       \
        //        4
        //递归,把1的右子树5-6移到1的左子树2-3-4的右子树下
        //      1
        //     / \
        //    2   5
        //     \   \
        //      3   6
        //       \
        //        4
        //         \
        //          5
        //           \
        //            6
        //把1的左子树2-3-4-5-6替换到右子树上,把1的左子树置空
        //      1
        //       \
        //        2
        //         \
        //          3
        //           \
        //            4
        //             \
        //              5
        //               \
        //                6
        //链表符合前序遍历了,并且左子树全为null
        //下面是具体代码实现
        TreeNode leftTail = flattenHelper(node.left);
        TreeNode rightTail = flattenHelper(node.right);


        if (leftTail != null) {
            // 把右子树放到左子树的右子树上
            leftTail.right = node.right;
            // 把(带有右子树的)左子树赋给右子树
            node.right = node.left;
            // 右子树清空
            node.left = null;
        }

//        在这里,rightTail 的优先级最高,然后是 leftTail,最后是 node。
//        这确保了在递归的过程中,当前子树展开后的链表的尾节点是按照
//        右子树、左子树、当前节点的顺序确定的。
//        这样的顺序保证了链表的正确连接,即右子树的尾部接在左子树的尾部,
//        而左子树的尾部接在当前节点的右侧。这样展开后的链表顺序符合二叉树的先序遍历。
        return (rightTail != null) ? rightTail : (leftTail != null) ? leftTail : node;
    }

    // 示例测试
    public static void main(String[] args) {
        FlattenBinaryTreeToLinkedList solution = new FlattenBinaryTreeToLinkedList();

        // 构造示例二叉树
        TreeNode root = new TreeNode(1);
        root.left = new TreeNode(2);
        root.right = new TreeNode(5);
        root.left.left = new TreeNode(3);
        root.left.right = new TreeNode(4);
        root.right.right = new TreeNode(6);

        // 调用展开方法
        solution.flatten(root);

        // 打印展开后的链表
        TreeNode current = root;
        while (current != null) {
            System.out.print(current.val + " ");
            current = current.right;
        }
    }
}

时间空间复杂度

  • 时间复杂度:O(n),其中n是二叉树中的节点数,每个节点都需要访问一次。
  • 空间复杂度:O(h),递归调用栈的深度为树的高度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/507533.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

中间系统-度量值、主机名映射、收敛特性、区域迁移、多拓扑

中间系统-度量值,主机名映射,收敛特性 1、ISIS度量值 ISIS Cost计算:一个接口的cost固定等于10. ISIS的Cost值范围为1~63(称为IS-IS开销类型为narrow窄度量),不够使用只能做扩展(宽度量&…

SwiftUI Swift 选择图片 添加图片

1. 添加记帐时添加图片功能 2. Show me the code // // TestPhotoPicker.swift // pandabill // // Created by 朱洪苇 on 2024/3/30. //import SwiftUI import PhotosUI import Foundationstruct TestPhotoPicker: View {State private var selectedItem: PhotosPickerIt…

机器学习在智能音箱中的应用探索与实践:让声音更懂你

🧑 作者简介:阿里巴巴嵌入式技术专家,深耕嵌入式人工智能领域,具备多年的嵌入式硬件产品研发管理经验。 📒 博客介绍:分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向的学习指导…

多微信聚合聊天神器,让你的社交更高效!

对于那些拥有多个微信号的用户来说,频繁地在不同微信号和设备之间切换既麻烦又容易搞混。这时候,一款多微信聚合聊天神器——微信管理系统应运而生,为我们带来了极大的便利与高效。 下面一起来看看它都有哪些功能吧! 1、多微信同…

Google Chrome将某个页签静音,不是网站

Google Chrome将某个页签静音,不是网站 打开chrome://flags/在里面搜索,audio,找到Tab audio muting UI contorl的选项,右侧设置为Enable。重新启动浏览器。 发现有声音的浏览器页签有一个喇叭图标,点击一下就行了。

【游戏分析】FPS游戏狩猎百发百中

某某游戏狩猎玩法及其类似于FPS游戏 即3D射击 所以同样拥有 自动瞄准功能和爆头功能 想达到百发百中我们就要精准的计算出3D朝向值 读取人物坐标 遍历怪物,读取怪物坐标比较简单,不过多陈诉 朝向自然而然一定是我们和敌人的坐标计算出来的 那么怎么计算的呢? 我…

web安全学习笔记【21】——安全开发

安全开发-PHP应用&留言板功能&超全局变量&数据库操作&第三方插件引用 #知识点: 1、PHP留言板前后端功能实现 2、数据库创建&架构&增删改查 3、内置超全局变量&HTML&JS混编 4、第三方应用插件&传参&对象调用 DAY1 #章…

Shopee,lazada如何实施稳定的测评,补单自养号方案,关键的步骤和条件

随着平台竞争激烈,越来越多的商家对常规运营也是力不从心。传统的广告和营销方式已经无法满足商家的需求,因此自养号测评也成为商家重要的推广方式。实现自养号测评,补单所需的技术条件。 1.不同账户的独立运行环境和阻断平台检测非常重要。稳…

判断点在多边形内的算法

在计算几何中,判定点是否在多边形内,是个非常有趣的问题。通常有两种方法: 一、Crossing Number(交叉数) 它计算从点P开始的射线穿过多边形边界的次数。当“交叉数”是偶数时,点在外面;当它是奇数时&…

花大钱办小事,游戏厂商为何开始打造奢华版副游?

3月28日,网易号称耗时6年、花费10亿研发的年度重磅MMO产品《射雕》上线。 对比同样在三月份腾讯开放测试的MMO游戏《塔瑞斯世界》,会发现很有意思的一幕:相比《塔瑞斯世界》想要打造手游版“魔兽世界”,不断完善养成体系想要把玩…

应急响应靶机训练-Linux1题解

前言 接上文,应急响应靶机训练Linux1 靶机地址: 应急响应靶机-Linux(1) 最近感冒了,就没录视频版。 题解 目标:3个flag以及黑客的ip地址 登陆虚拟机 密码defend flag1: su history flag{thisismybaby} flag2:…

4月4日生效!管控升级!继续围堵 | 百能云芯

据路透社29日报道,美国拜登政府当天修改规则,升级针对中国人工智能(AI)芯片和相关工具出口管制的措施。报道声称,这是美国以国家安全为由阻碍中国芯片制造业发展的努力的一部分。 美国商务部下属的工业与安全局&#x…

【缺陷】硅光电二极管中的DT侧壁陷阱态的DLTS表征

【A DLTS study on Deep Trench Processing induced Trap States in Silicon Photodiodes】 概括 本研究通过深能级瞬态光谱(DLTS)技术对硅光电二极管中的深沟槽(DT)侧壁诱导的陷阱态进行了详细分析。研究发现,这些陷…

从 Azure 部署生成本地 .NET 密钥

作者:Frank Boucher 排版:Alan Wang 通常,示例项目以一些“魔术字符串”开始,这些变量包含与部署或外部资源相关的 URL 和关键信息,我们必须更改这些信息才能使用示例。例如在 .NET 中,它可能如下所示&…

基于 YOLO V8 Pose Fine-Tuning 训练 15 点人脸关键点检测模型

一、YOLO V8 Pose YOLO V8 在上篇文章中进了简单的介绍,并基于YOLO V8 Fine-Tuning 训练了自定义的目标检测模型,而YOLO V8 Pose 是建立在YOLO V8基础上的关键点检测模型,本文基于 yolov8n-pose 模型实验 Fine-Tuning 训练15 点人脸关键点检…

04_Git开发流程

文章目录 Git开发创建阶段开发阶段合并阶段常用指令 Git开发 创建阶段 共建Git仓库,首次使用请使用git clone指令 git clone xxx.git在master/main主干上搭建起基本的项目结构和公共内容,将这些内容push到远程仓库 在Github上创建分支dev(de…

浅谈高阶智能驾驶-NOA领航辅助的技术与发展

浅谈高阶智能驾驶-NOA领航辅助的技术与发展 附赠自动驾驶学习资料和量产经验:链接 2019年在国内首次试驾特斯拉NOA领航辅助驾驶的时候,当时兴奋的觉得未来已来;2020年在试驾蔚来NOP领航辅助驾驶的时候,顿时不敢小看国内新势力了;现在如果哪家…

houdini 对lsystem类carve效果

1.for 对每个prim执行carve 2.delete 3.

吴恩达:现在做GPT-4智能体,或将提前达到GPT-5效果|钛媒体AGI

斯坦福大学客座教授吴恩达(Andrew Ng)© 林志佳 美国斯坦福大学教授吴恩达(Andrew Ng) 人工智能智能体(AI Agents)似乎将引领 AI 行业新的发展趋势。 近日红杉资本(Sequoia)在…

使用 MergeKit 创建专家组合---将多个模型合并到同个 MoE 中

原文地址:create-mixtures-of-experts-with-mergekit 2024 年 3 月 27 日 由于 Mixtral 的发布,Mixture of Experts(MoE)架构近几个月开始流行。这种架构提供了一个有趣的权衡:以增加 VRAM 使用为代价获得更高的性能…