【Hot100】LeetCode—114. 二叉树展开为链表

news2024/9/28 11:12:46

目录

  • 1- 思路
    • 技巧——借助指针
  • 2- 实现
    • ⭐114. 二叉树展开为链表——题解思路
  • 3- ACM 实现


  • 原题连接:114. 二叉树展开为链表

1- 思路

技巧——借助指针

思路:通过 ① 将左子树的右下结点的 .next ——> 拼接到当前节点的右子树上

  • 构造 cur 指针, cur = root
  • 借助 pre 指针和 next 指针
    • pre 指针:用来定位左子树的最右下结点,用来拼接现有结点的右侧子树
    • next 指针:又来记录 cur.next 用来处理,用于 更新现有结点的右子树

  • 1- 第一个 while 条件 **while(cur != null)**
    • 1.1 如果左侧不为 null
      • 定义 next ,记录翻转后的 next 结点,next = cur.left
      • 定义 pre,利用 while,定位 pre 到最右下结点pre = next
  • 2- 更新逻辑
    • 2.1 利用 pre 定位到 左子树的 最右下结点
    • 2.2 prenextcur.next
    • 2.3 cur.right = next
    • 2.4 cur.left = null;
  • 3- 最终移动 cur
    • cur = cur.next

2- 实现

⭐114. 二叉树展开为链表——题解思路

在这里插入图片描述

class Solution {
    public void flatten(TreeNode root) {
        TreeNode cur = root;
        while(cur!=null){
            if(cur.left!=null){
                TreeNode next = cur.left;
                TreeNode pre = next;
                while(pre.right != null){
                    pre = pre.right;
                }
                // 更新逻辑
                pre.right = cur.right;
                cur.right = next;
                cur.left = null;
            }
            cur = cur.right;
        }

    }
}

3- ACM 实现

public class falttern {

    public static 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;
        }
    }

    public static TreeNode build(String str){
        if(str == null || str.length()==0){
            return null;
        }
        String input = str.replace("[","");
        input = input.replace("]","");
        String[] parts = input.split(",");

        Integer[] nums = new Integer[parts.length];
        for(int i = 0 ; i < parts.length;i++){
            if(!parts[i].equals("null")){
                nums[i] = Integer.parseInt(parts[i]);
            }else{
                nums[i] = null;
            }
        }
        Queue<TreeNode> queue = new LinkedList<>();
        TreeNode root = new TreeNode(nums[0]);
        queue.offer(root);
        int index = 1;
        while(!queue.isEmpty()&& index<parts.length){
            TreeNode node = queue.poll();
            if(index<nums.length && nums[index]!=null){
                node.left = new TreeNode(nums[index]);
                queue.offer(node.left);
            }
            index++;
            if(index<nums.length && nums[index]!=null){
                node.right = new TreeNode(nums[index]);
                queue.offer(node.right);
            }
            index++;
        }
        return root;
    }

    public static void flattern(TreeNode root){
        TreeNode cur = root;
        while(cur!=null){
            if(cur.left!=null){
                TreeNode pre = cur.left;
                TreeNode next = pre;
                while(pre.right!=null){
                    pre = pre.right;
                }
                // 处理逻辑
                pre.right = cur.right;
                cur.right = next;
                cur.left = null;
            }
            cur = cur.right;
        }
    }

    static List<List<Integer>> res = new ArrayList<>();
    public static List<List<Integer>> levelOrder(TreeNode root) {
        if(root==null){
            return res;
        }
// 队列
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        while(!queue.isEmpty()){
            int len = queue.size();
            List<Integer> path = new ArrayList<>();
            while(len>0){
                TreeNode nowNode = queue.poll();
                path.add(nowNode.val);
                if(nowNode.left!=null) queue.offer(nowNode.left);
                if(nowNode.right!=null) queue.offer(nowNode.right);
                len--;
            }
            res.add(new ArrayList<>(path));
        }
        return res;
    }


    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String input = sc.nextLine();
        TreeNode root = build(input);
        flattern(root);
        levelOrder(root);
        System.out.println("结果是"+res.toString());
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

KPaaS还是ESB?怎样选择合适的集成方案?

在全球经济一体化和数字化转型的背景下&#xff0c;企业正面临着前所未有的挑战与机遇。随着业务的快速发展&#xff0c;企业内部的信息系统日益复杂&#xff0c;系统间的信息孤岛、系统割裂以及高昂的维护成本等问题逐渐凸显&#xff0c;严重制约了企业的创新能力和市场竞争力…

Live800:以数据驱动的客户服务优化,精准洞察,超越期待

在当今这个数字化时代&#xff0c;企业之间的竞争已不仅仅局限于产品本身的质量与功能&#xff0c;更在于如何通过卓越的客户服务体验来赢得客户的忠诚与信赖。数据&#xff0c;作为这一转型过程中的核心驱动力&#xff0c;正引领着客户服务向更加精准、高效、个性化的方向迈进…

3ds Max - 导出顶点色模型

很久之前的笔记&#xff0c;整理归档&#xff1b; 在3ds Max中&#xff0c;给模型添加VetexPaint修改器后&#xff0c;可以给模型&#xff08;顶点色通道R\G\B默认值为255\255\255&#xff09;刷不同颜色的顶点色&#xff08;默认为黑色&#xff0c;即让RGB通道都为0&#xff0…

最新SD换脸插件ReActor,视频换脸全流程!流畅丝滑!(附插件及安装报错说明)

在今天&#xff0c;我给大家继续分享一个使用“ReActor”插件来进行视频换脸的案例。 视频换脸的思路其实也很简单&#xff0c;其实就是把视频的每一帧都提取出来&#xff0c;然后把每一帧的图片都进行换脸&#xff0c;最后重新把这些图片重新合成一个视频。 废话不多说&…

下载bison操作步骤

bison官网链接 bison-3.8.2官网源代码下载链接 选择下载版本

strchr 和 strrchr

char *strchr(const char *s, int c); 在 s 中查找第一次出现字符c的位置&#xff0c;返回指向找到的位置&#xff0c;找不到返回null。 char *strrchr(const char *s, int c); 在 s 中查找最后一次出现字符c的位置&#xff0c;返回指向找到的位置&#xff0c;找不到返回null。…

用Python插入SVG到PDF文档

将SVG&#xff08;可缩放矢量图形&#xff09;文件插入到PDF&#xff08;便携式文档格式&#xff09;文件中不仅能够保留SVG图像的矢量特性&#xff0c;确保图像在任何分辨率下都保持清晰&#xff0c;还能够充分利用PDF格式在跨平台文档分享方面的优势&#xff0c;使得技术文档…

解决 mfc140.dll 文件丢失的问题,5种mfc140.dll解决方法

当您尝试启动一个用 Microsoft Visual Studio 2015 开发的 Windows 应用程序时&#xff0c;如果出现“无法找到 mfc140.dll 文件”的错误&#xff0c;请不要紧张。这类问题通常由DLL文件缺失、损坏或未正确安装引起。好消息是&#xff0c;存在多种解决方案可以帮助您解决这一挑…

打卡学习Python爬虫第五天|Xpath解析的使用

什么是Xpath&#xff1f;是在XML文档中搜索内容的一门语言&#xff0c;HTML可以看作是xml的一个子集。 目录 1、安装lxml模块 2、导入lxml中的etree子模块 3、Xpath使用方法 3.1.选择节点 3.2.选择属性 3.3.选择文本内容 3.4.使用通配符*过滤节点 3.5.使用中括号[]索引…

半个小时写一个自动发朋友圈的工具

最近一直在完善我的手控达人系统&#xff0c;解决了很多难题。白天没事时想思路&#xff0c;晚上写代码验证。这不昨天又加了一个发朋友圈功能。自动发朋友圈&#xff0c;点赞功能。 效果请看:【微信自动发朋友圈&#xff0c;一键发朋友圈&#xff0c;点赞&#xff0c;金币&…

鸿道Intewell操作系统国产ARM生态:芯驰D9(9360)

随着全球经济环境的变化和国家政策的推动&#xff0c;国产操作系统和芯片产业正在迅速发展&#xff0c;成为提升国家竞争力的关键因素。国产工业操作系统与国产芯片的发展对于推动国内工业的自主可控和技术创新具有重要意义。 鸿道Intewell操作系统国产ARM生态&#xff1a;芯驰…

【ACM稳定出版,高录用稳检索】第八届电子信息技术与计算机工程国际学术会议(EITCE 2024,10月18-20)

第八届电子信息技术与计算机工程国际学术会议&#xff08;EITCE 2024&#xff09;将于2024年10月18日至20日在中国海口举办。 本次会议旨在汇集全球电子信息技术与计算机工程领域的学者、科研专家及行业实践者&#xff0c;共同探讨该领域的最新研究成果、技术进展与学术动态。会…

工业排污检测算法实际算法应用算法价值算法源码、算法样本展示

工业排污检测算法识别是环境保护领域的一项重要技术手段&#xff0c;它结合了图像识别、声音识别、数据分析等多种先进技术&#xff0c;以实现对工业排污行为的全面监测和准确分析。以下是关于工业排污检测算法识别的详细阐述&#xff1a; 一、算法原理 工业排污检测算法通过…

YOLOv9改进策略【注意力机制篇】| 引入SimAM注意力模块(一个简单的,无参数的卷积神经网络注意模块)

一、本文介绍 本文记录的是基于SimAM注意力模块的YOLOv9目标检测方法研究。SimAM注意力模块通过优化能量函数来获得每个神经元的三维权重&#xff0c;而无需引入额外的参数或增加计算复杂度。若是有轻量化需求的小伙伴&#xff0c;无参的注意力模块也许是一个不错的选择。 文章…

MATLAB 手动实现体素中心点采样抽稀法(72)

. 往期文章回顾 MATLAB 自定义体素中心点采样抽稀法(72) 一、算法简介二、算法实现1.代码2.效果总结一、算法简介 下面是手动实现的体素采样法,用于对点云数据抽稀,减少点云数量,具体的方法就是建立空间三维体素,每个内部存在点云的体素,选择体素中心点保留,最终得到…

使用kafka改造分布式事务

文章目录 1、kafka确保消息不丢失&#xff1f;1.1、生产者端确保消息不丢失1.2、kafka服务端确保消息不丢失1.3、消费者确保正确无误的消费 2、生产者发送消息 KafkaService3、UserInfoServiceImpl -> login()4、service-account - > AccountListener.java 1、kafka确保消…

电磁炮设计

视频链接&#xff1a; 电磁炮视频 项目简介 这个项目电磁炮主要是&#xff0c;测试电磁炮原理部分的简易制作&#xff0c;对原理有初步认识&#xff0c;升压电路采用的是boost电路&#xff0c;IGBT作为开关管&#xff0c;电解电容作为储能元件。 项目功能 本设计是基于STM32F4…

Chapter 02 Vue指令(上)

欢迎大家订阅【Vue2Vue3】入门到实践 专栏&#xff0c;开启你的 Vue 学习之旅&#xff01; 文章目录 前言一、v-text指令二、v-html指令三、v-show指令四、v-if指令五、v-else指令六、v-else-if指令 前言 在 Vue.js 中&#xff0c;指令是带有 v- 前缀的特殊属性&#xff0c;不…

【大数据】数据仓库的定义、数据模型及其建设与设计

1. 数据仓库 1.1 定义 数据仓库不是数据的简单堆积&#xff0c;而是从大量的事务型数据库中抽取数据&#xff0c;并将其清理、转换为新的存储格式,即为决策目标把数据聚合在一种特殊的格式中。公认的数据仓库之父 W.H. Inmon 将其定义为&#xff1a;“数据仓库是支持管理决策…

【秋招笔试】8.19蔚来秋招-三语言题解

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 编程一对一辅导 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 🍒 本专栏已收…