题目

题目同上一篇文章,即题目将二叉树按照中序顺序转换成双向链表


思路

方法二:利用递归函数,不使用任何容器。时间复杂度为O(N),额外空间复杂度为O(h),h为二d d d df叉树的高度

  1. 首先需要一个新的类,来返回有序双向链表的头节点和尾节点,ReturnTpye类
  2. 先将以X为头节点的左子树转换为有序双向链表,再将X的右子树转换为有序双向链表,通过X把两部分连接即可
  3. 具体实现看下面的代码部分

源码

public class ReturnType{public Node start;public Node end;public ReturnType(Node start, Node end){this.start=start;this.end=end;}
}
public Node convert2(Node head){if(head==null){return null;}return process(head).start;
}public ReturnType process(Node head){if(head==null){return new ReturnType(null,null);}ReturnType leftList=process(head.left);ReturnType rightList=process(head.right);if(leftList.end!=null){leftList.end.right=head;}head.left=leftList.end;head.right=rightList.start;if(rightList.start!=null){rightList.start.left=head;}return new ReturnType(leftList.start!=null?leftList.start:head,rightList.end!=null?rightList.end:head);
}

解析

时间复杂度可以用process递归函数发生的次数来估算,process会处理所有子树,子树的数量就是二叉树节点的数量。所以时间复杂度为O(N),process递归函数最多会占用二叉树高度为h的栈空间,额外的空间复杂度也就是O(h)了。


扩展

本题在复杂度方面完全取决于二叉树的遍历的实现。有没有时间复杂度为O(N),额外空间复杂度为O(1)的遍历实现呢?也就是既不用栈,也不用递归函数,只用几个变量?有的,后续在二叉树的部分,还会结合神级的遍历方法('遍历二叉树的神级方法')重新实现这一道题。

链表问题15——将搜索二叉树转换成双向链表(方法二)相关推荐

  1. 链表问题15——将搜索二叉树转换成双向链表

    题目 将一颗搜索二叉树按照中序遍历(左-中-右)的顺序,变成一个有序的双向链表. 所谓的先序遍历.中序遍历和后序遍历都针对的是中间的节点也就是根节点,先序遍历为中-左-右,后序遍历为左-右-中 思路 ...

  2. 左神算法:将搜索二叉树转换成双向链表(Java版)

    本题来自左神<程序员代码面试指南>"将搜索二叉树转换成双向链表"题目. 题目 对二叉树的节点来说,有本身的值域,有指向左孩子节点和右孩子节点的两个指针:对双向链表的节点 ...

  3. 将搜索二叉树转换成双向链表

    题目: 对二叉树的节点来说,有本身的值域,有指向左孩子和右孩子的两个指针:对双向链表的节点来说,有本身的值域,有指向上一个节点和下一个节点的指针.在结构上,两种结构有相似性,现在有一棵搜索二叉树,请将 ...

  4. 将二叉树转换成双向链表

    思路:採用中序遍历的方法,visit函数须要完毕的功能为: 1.当前节点的左子节点指向上一次訪问的节点: 2.将上一次訪问节点的右子节点指向当前节点: 3.最后更新上一次訪问节点为当前节点. 在第二步 ...

  5. 二叉树转换成森林amp;森林变成二叉树

    一,树转换成二叉树 1,将全部兄弟结点连起来; 2,保留第一个兄弟结点与父节点的连接,断开其它兄弟结点与父节点的连接,然后以根节点为轴依照顺时针方向旋转45度 二,二叉树转换成森林 方法: 1,将每棵 ...

  6. LintCode 378. 将二叉树转换成双链表(非递归遍历)

    文章目录 1. 题目 2. 解题 1. 题目 将一个二叉树按照中序遍历转换成双向链表. 样例 样例 1: 输入:4/ \2 5/ \1 3 输出: 1<->2<->3<- ...

  7. 新手学习算法----二叉树(将一个二叉查找树按照中序遍历转换成双向链表)

    题目:将一个二叉查找树按照中序遍历转换成双向链表. 给定一个二叉查找树: 4/ \2 5/ \ 1 3 返回 1<->2<->3<->4<->5. 思路 ...

  8. 二叉树:表达式二叉树转换成中缀式(括弧处理)

    文章目录 问题描述 : 输入说明 : 输出说明 : 输入范例 : 输出范例 : 思路分析 代码实现 事故现场 第一次提交 分析与总结 如果不妥请留言,你的关注和回复是对我最大的鼓励,谢谢!如果想立即回 ...

  9. 最全的PDF转换成Word方法,搞定市面上99%的PDF

    办公学习中将Word转换成PDF相信大家都会,安装稍微高级点的office软件直接另存为PDF即可,但是为了便于编辑,经常需要将PDF转换成Word,个人在被"PDF转换成Word" ...

最新文章

  1. MySQL应用异常问题解决
  2. VMware宋家瑜:U2VL要趁早
  3. 三相逆变器双pi控制器参数如何调节_Boost 变换器 PI参数设计举例
  4. okta使用_使用Okta的单点登录保护您的Vert.x服务器
  5. ios中获取各种文件的目录路径方法
  6. 三菱st语言编程实例_C语言编程实例39
  7. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_04 IO字节流_1_IO概述(概念分类)...
  8. (转)直击马云虞锋闭门对话,3小时谈透未来变革大势,定调千亿美元目标
  9. UE破解及注册机下载
  10. IEEE与APA引用格式
  11. 一阶惯性环节如何实现跟踪性能与滤波性能共存(总)
  12. 文字转语音开源软件-espeak
  13. sata AHCI驱动下载(AMD Intel Nvidia)
  14. css相对图片加文字,html+css怎么在图片上添加文字
  15. 银行从业如何备考,有什么刷题的APP?
  16. 2021年研究生入学考试总结和复试冲刺复习计划
  17. 糖豆大小的真无线耳机,续航还挺长,Jeet Air 2体验
  18. railgun单个服务器APP的结构
  19. 《概率论与数理统计》之 typeⅠ、typeⅡ(第一类错误和第二类错误)理解
  20. cass怎么多级放坡_【干货】四面放坡且坡度不同的工程土方,CASS怎么算?

热门文章

  1. 如何写出符合Python审美的代码风格?
  2. 面试官:如果要存ip地址,用什么数据类型比较好
  3. 面试官:小伙汁,你画的SpringMVC请求处理过程是从网上抄的吧?
  4. 写出我的第一个框架:迷你版Spring MVC
  5. Java8中一个极其强悍的新特性,很多人没用过(非常实用)
  6. 图解 Java 垃圾回收机制,写得非常好!
  7. 常见的集合容器应当避免的坑
  8. 机器学习调参自动优化方法
  9. Python的深浅拷贝讲解!
  10. 深度学习之Pytorch基础教程!