题目

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。
需要返回双向链表最左侧的节点。

思路 1

  1. 排序链表:利用二叉搜索树的中序遍历为递增序列,从小到大访问节点
  2. 双向链表:构造链表时,需要规定前驱节点 pre ,并且 pre.right = cur 的同时也要 cur.left = pre
  3. 循环链表:构造双向链表时记录头尾节点,构造完成后设置 head.left = tail 和 tail.right = head

因此,使用中序遍历访问树的各节点 cur ;并在访问每个节点时构建 cur 和前驱节点 pre 的引用指向;中序遍历完成后,构建头节点和尾节点的引用指向。

注意:
中序遍历若采用递归,一定要有终止条件,其他的遵从递归框架
这道题有特例,root 为空时,直接返回,不能按照正常流程走


参考 Krahets - leetcode

代码

Version 1

class Solution(object):def treeToDoublyList(self, root):""":type root: Node:rtype: Node"""def inorder(node):# BT递归框架不变if not node: return inorder(node.left)# 对于 node 做什么写在这里,其余交给框架if self.pre:self.pre.right, node.left = node, self.preelse:self.head = node  # self.pre == None, 标记此时的 cur 为headself.pre = node       # 用于下次双向连接inorder(node.right)if not root: return   ### 漏了这句就错!因为是特例,此时没有self.head 以及 self.head.left ...self.pre = Noneinorder(root)self.head.left, self.pre.right = self.pre, self.head # 最后一次存储的self.pre就是tailreturn self.head

关于 self 的使用:
可以将加 self. 的变量理解为“类的成员变量”, 可以在方法中直接定义,这样就能在类的其他方法里共用了。本题中,由于中序遍历完还需要用到 pre 去实现循环链表,因此我们采用 self.pre ,使其在外部和内部函数中都可以正常访问 ~

诸如 pre = ListNode() , a = 1 等变量,如果想在内外层函数里共用,都必须加 self ,加 self 能限定处理的是同一个对象的参数,如果不加 self 而采用函数传参的方式,每次函数迭代处理的实际上是局部变量,内层函数退出后该变量结果不被保留。另外,list类型的参数可以不加 self,因为函数传递过程中传递的是列表的引用,也就是说在递归的过程中,操作的都是同一个内存空间的list,可以不加self。

复杂度分析:
时间复杂度 O(N) : N 为二叉树的节点数,中序遍历需要访问所有节点。
空间复杂度 O(N) : 最差情况下,即树退化为链表时,递归深度达到 N,系统使用 O(N) 栈空间。

Version 2

先完成中序遍历,拿到递增序列(序列中节点的存储形式是Node而非val,因为后面需要用到node.left/right …)
然后遍历序列,对每一个节点执行变为双向链表的操作
最后连接头节点和尾节点,变为循环双向排序链表

容易理解,时空复杂度逊于 Version1

class Solution(object):def treeToDoublyList(self, root):""":type root: Node:rtype: Node"""def inorder(node):if not node:returninorder(node.left)self.res.append(node) # 后面需要用到node.left/right,因此作为Node存储inorder(node.right)if not root:returnself.res = []inorder(root)for i, node in enumerate(self.res[:-1]):node.right = self.res[i + 1]self.res[i + 1].left = nodeself.res[0].left, self.res[-1].right = self.res[-1], self.res[0] # 循环链表return self.res[0]

[剑指offer] 36. 二叉搜索树与双向链表相关推荐

  1. 【LeetCode】剑指 Offer 36. 二叉搜索树与双向链表

    [LeetCode]剑指 Offer 36. 二叉搜索树与双向链表 文章目录 [LeetCode]剑指 Offer 36. 二叉搜索树与双向链表 package offer;//定义节点 class ...

  2. 【Java】 剑指offer(36) 二叉搜索树与双向链表

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不 ...

  3. 【LeetCode笔记】剑指 Offer 36. 二叉搜索树与双向链表(Java、二叉树、链表、原地算法)

    文章目录 题目描述 思路 && 代码 1. 非原地算法 2. 原地算法 二刷 题目描述 谈到二叉搜索树,那就得考虑考虑中序遍历啦- 这道题对中序遍历的理解提升很有好处! 思路 & ...

  4. 【算法】剑指 Offer 36. 二叉搜索树与双向链表

    1.概述 地址:https://leetcode-cn.com/problems/er-cha-sou-suo-shu-yu-shuang-xiang-lian-biao-lcof/ /* // De ...

  5. 2021-08-19剑指 Offer 36. 二叉搜索树与双向链表

    我的思路: 前序遍历保证链表的有序性,并且在这个遍历的同时调整指针的指向 class Solution {public:Node* treeToDoublyList(Node* root) {if(r ...

  6. 【剑指offer】二叉搜索树转双向链表,C++实现

    原创博文,转载请注明出处! # 题目 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 二叉树节点的定义 struct TreeNod ...

  7. 剑指offer之二叉搜索树和双向链表

    1 问题 比如我们搜索二叉树如下,我们需要变成双向链表 2 分析 我们知道这个变成双向链接的时候是按照树的中序遍历打印的,我们只需要在中序遍历打印的时候操作该节点,我们可以用临时变量保存这个节点,同时 ...

  8. 【LeetCode】剑指 Offer 33. 二叉搜索树的后序遍历序列

    [LeetCode]剑指 Offer 33. 二叉搜索树的后序遍历序列 文章目录 [LeetCode]剑指 Offer 33. 二叉搜索树的后序遍历序列 package offer;public cl ...

  9. 【LeetCode】剑指 Offer 54. 二叉搜索树的第k大节点

    [LeetCode]剑指 Offer 54. 二叉搜索树的第k大节点 文章目录 [LeetCode]剑指 Offer 54. 二叉搜索树的第k大节点 一.中序遍历(提前返回) 一.中序遍历(提前返回) ...

最新文章

  1. 快速幂 + 矩阵快速幂
  2. python oop求三角形面积公式_python学习日记(OOP——类的内置方法)
  3. 模型诊断(Model Diagnostics)是什么?具体包含哪些内容?
  4. CNCC技术论坛丨联邦学习冲刺人工智能“最后一公里”!
  5. ASP.NET MVC案例教程(基于ASP.NET MVC beta)——第一篇:准备工作
  6. 项目管理基础培训分享
  7. 从SAP客户主数据里直接创建商机(Opportunity)
  8. 增量值编码器、单圈绝对值编码器、多圈绝对值编码器
  9. 2018-11-01 专栏一岁了-我为什么投身于普及用中文编程
  10. 爬虫案例:利用python爬虫关键词批量下载高清大图
  11. spring boot controller 初始化_基于 tyboot 快速初始化 springboot 单体项目
  12. for循环如果先--_如果再写for循环,我就锤自己!
  13. Kendo UI开发教程(25): 单页面应用(三) View
  14. SharedMaterial的一些问题
  15. Maven—Eclipse中配置Maven
  16. Android编译tcpdump,android 5.0以上使用tcpdump
  17. [DappReview]2020年第一季度Dapp市场报告
  18. 员工效率低下,责任在管理层的数学解释和分析
  19. 广X斜Y-1顶岗纪实
  20. 树莓派4B安装桌面控件wbar和conky,美化桌面(解决报错)

热门文章

  1. 从序列化输入到蛋白质结构预测(RoseTTAFoldAlphaFold2)
  2. 苹果大战泄密者内幕曝光:从中国工厂到美国总部
  3. word2013无法打开doc文件显示正在受保护视图中打开解决方法
  4. Invertible Image Rescaling 可逆图像缩放:完美恢复降采样后的高清图片(ECCV 2020 Oral )
  5. 选择模型 _ 审查回归算法
  6. python打开桌面文件_python整理桌面文件
  7. vue路由第三篇-导航守卫、路由元信息、动态路由
  8. Go语言处理Windows系统的图标ICO文件(中)
  9. 加州大学圣地亚哥分校计算机科学排名,加州大学圣地亚哥分校计算机科学硕士排名第18(2020年TFE Times排名)...
  10. mysql round不四舍五入_MySQL中ROUND函数进行四舍五入操作陷阱分析