当前位置: 首页 > news >正文

力扣114. 二叉树展开为链表(java,用树模拟链表)

Problem: 114. 二叉树展开为链表

文章目录

  • 题目描述
  • 思路
  • 解题方法
  • 复杂度
  • Code

题目描述

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

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

在这里插入图片描述
在这里插入图片描述

思路

我们易知,树与链表两种数据结构都可以通过指针操作来实现,换一句说两种数据结构都可以归结为一种链式数据结构只不过一般情况下,一般普通链表每一个节点后都只有一个next指针;一般的二叉树每个节点后都会有两个指针left指针和right指针,所以我们即可想到使用一个树来模拟实现链表!!!

image.png

1.创建虚拟头节点和尾指针,尾指针初始化指向虚拟头节点。
2.每次遍历过程中将上一节点的right指针指向当前节点,上一节点的left指针置为null
image.png

解题方法

1.创建虚拟头节点和尾指针,尾指针初始化指向虚拟头节点。
2.编写辅助的前序遍历函数,每次先取出当前节点的左右子树,再将每次按先序遍历的到的节点添加到尾指针后

复杂度

时间复杂度:

O ( n ) O(n) O(n)

空间复杂度:

O ( 1 ) O(1) O(1)

Code

/*** 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 {//创建虚拟头节点private TreeNode dummyHead = new TreeNode();//创建尾指针private TreeNode tail = dummyHead;/*** 将一个二叉树展开为一个单链表** @param root 树的根节点*/public void flatten(TreeNode root) {preOrder(root);}/*** 先序遍历,将每次遍历到的节点添加到链表中** @param root 树的根节点*/private void preOrder(TreeNode root) {if (root == null) {return;}//先取出当前节点的左右节点TreeNode leftNode = root.left;TreeNode rightNode = root.right;//把遍历到的节点放在链表中tail.right = root;tail = root;tail.left = null;preOrder(leftNode);preOrder(rightNode);}}

相关文章:

  • wagtail-安装配置
  • NextJS开发:Image组件的使用及缺陷
  • SQL 中的运算符与别名:使用示例和语法详解
  • java/Android:将字符串按数量分割
  • 「torch.cosine_smilarity() = 0」引发的关于cpu与gpu精度问题的探讨
  • 自动驾驶术语汇总
  • mac rancher desktop 修改docker镜像源
  • Vue框架学习笔记——数据代理
  • 2023年【道路运输企业安全生产管理人员】最新解析及道路运输企业安全生产管理人员复审考试
  • 微服务学习(十二):安装Minio
  • spark shuffle 剖析
  • 芯片安全和无线电安全底层渗透技术
  • 算法设计与实现--分治篇
  • 什么是软件需求?以及需求的最佳实践?
  • 语音识别入门——常用软件及python运用
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • 07.Android之多媒体问题
  • Django 博客开发教程 16 - 统计文章阅读量
  • export和import的用法总结
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • Laravel Mix运行时关于es2015报错解决方案
  • PhantomJS 安装
  • PHP面试之三:MySQL数据库
  • SpiderData 2019年2月25日 DApp数据排行榜
  • Spring Cloud中负载均衡器概览
  • vue从创建到完整的饿了么(18)购物车详细信息的展示与删除
  • Yii源码解读-服务定位器(Service Locator)
  • 技术发展面试
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 坑!为什么View.startAnimation不起作用?
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 树莓派 - 使用须知
  • 用简单代码看卷积组块发展
  • 阿里云重庆大学大数据训练营落地分享
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • #、%和$符号在OGNL表达式中经常出现
  • #Z0458. 树的中心2
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • (14)Hive调优——合并小文件
  • (delphi11最新学习资料) Object Pascal 学习笔记---第5章第5节(delphi中的指针)
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (笔记)Kotlin——Android封装ViewBinding之二 优化
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (力扣题库)跳跃游戏II(c++)
  • (免费领源码)python#django#mysql校园校园宿舍管理系统84831-计算机毕业设计项目选题推荐
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • (转)关于多人操作数据的处理策略
  • (轉貼)《OOD启思录》:61条面向对象设计的经验原则 (OO)
  • .bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息
  • .naturalWidth 和naturalHeight属性,
  • .NET CF命令行调试器MDbg入门(三) 进程控制
  • .Net CoreRabbitMQ消息存储可靠机制
  • .Net Redis的秒杀Dome和异步执行
  • .Net(C#)常用转换byte转uint32、byte转float等
  • .Net通用分页类(存储过程分页版,可以选择页码的显示样式,且有中英选择)