剑指Offer_编程题——二叉搜索树与双向链表

题目描述:

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

具体要求:

时间限制: C/C++ 1秒,其他语言2秒
空间限制: C/C++32M,其他语言64M

具体思路:

背景知识介绍

在做该题之前,我们应该首先了解二叉搜索树,详细解释请看本文。接下来,还需要我们了解二叉树的中序遍历,因为我们做本题最关键的思想就是二叉树的中序遍历。在维基百科中,树的中序遍历为:指先访问左(右)子树,然后访问根,最后访问右(左)子树的遍历方式。例如在以下的树中:

其中序遍历的顺序为:A B C D E F G H I。这就是中序遍历。最后还需要掌握双链表的相关知识。在维基百科中,双向链表是这样解释的双向链表,又称为双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。以下就是一个双向链表

根据题目可知:如果有以下的一颗树:

转换成相应的双向链表为:

具体思路:

根据我们理解的题意以及之前介绍的搜索二叉树和二叉树的中序遍历可知,二叉搜索树的中序遍历刚好是从小到大排序。因此本题的核心就是二叉搜索树的中序遍历,然后我们可以将遍历的结果存放在链表中。本题的关键是如何将左子树的最大值与右子树的最小值通过根root连接起来。比如题目中的8和12.这也是解决本题最为核心的部分。本题由于是二叉搜索树,因此有会用到我们的递归算法。其实应用递归需要我们理解递归进入的条件、递归返回的状态,如果递归进入时改变了环境,返回时应当恢复环境,就像栈的操作一样。在使用指针变量的时候一定要进行初始化,本题有一个小坑就是返回的不是表头而是root。具体我们可以用java和python来实现该思路。

1、首先用java来实现

public 

代码效果图如图所示:

正如前面提到一样,牛客网已经为我们定义了节点,不需要我们重复定义,但是在自己的本地编译器中,我们需要定义节点TreeNode的类,具体实现如下:

public 

2、接下来用python将其实现

class 

代码效果图如图所示:

用python实现树结构:

class 

总结

本道题主要二叉搜索树以及二叉树的中序遍历还有就是递归和双向链表。在解题之前我们给大家介绍了二叉搜索树、二叉树的中序遍历以及双向链表的基本知识,并且还给出了解题的思路,应用java和python两门语言将其实现,其实本题的关键就是中序遍历,还有一个小坑就是本题返回的不是链表表头,而是根节点。因此,我们需要深刻掌握树的相关实现,尤其是二叉树,并且也要掌握数据结构相关的知识,只有这样,才能遇到综合性问题做到融会贯通,写出优质的代码。总之,我们要继续加油,争取早日找到工作,Good Luck!!!

参考文献

[1]qq_23217629

[2]负雪明烛

[3]二叉搜索树

[4]二叉树的中序遍历

[5]双向链表

java 双向链表_Day26:二叉搜索树与双向链表相关推荐

  1. java面试(二)--(1)EJB的几种类型(2)Hibernate的悲观锁和乐观锁(3) 二叉搜索树与双向链表

    1.请说明一下EJB的几种类型分别是什么? EJB(Enterprise JavaBean)是J2EE服务器端的组件模型,EJB包括会话Bean(Session Bean).实体Bean(Entity ...

  2. JZ36 二叉搜索树与双向链表

    目录 题目介绍 二叉搜索树性质介绍 题目分析 解题方法 代码实现 题目介绍 题目链接 JZ36 二叉搜索树与双向链表 题目描述 输入一颗二叉搜索树,将该二叉搜索树转换为一个排序的双向链表 如: 题目要 ...

  3. 剑指offer:面试题36. 二叉搜索树与双向链表

    题目: 二叉搜索树与双向链表 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表.要求不能创建任何新的节点,只能调整树中节点指针的指向. 为了让您更好地理解问题,以下面的二叉搜索树为例: ...

  4. [二叉树]二叉搜索树转换为双向链表(剑指Offer26)

    [试题描述] 将二叉搜索树转换为双向链表 对于二叉搜索树,可以将其转换为双向链表,其中,节点的左子树指针在链表中指向前一个节点,右子树指针在链表中指向后一个节点. 思路一: 采用递归思想,对于二叉搜索 ...

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

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

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

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

  7. 【IT笔试面试题整理】二叉搜索树转换为双向链表

    [试题描述] 将二叉搜索树转换为双向链表 对于二叉搜索树,可以将其转换为双向链表,其中,节点的左子树指针在链表中指向前一个节点,右子树指针在链表中指向后一个节点. 思路一: 采用递归思想,对于二叉搜索 ...

  8. 【重点】剑指offer——面试题27:二叉搜索树与双向链表

    剑指offer--面试题27:二叉搜索树与双向链表 Solution1: 这是书上的代码,要理解好最近几道题,对指针的操作比较多... class Solution { public:TreeNode ...

  9. 二叉树OJ(一)二叉树的最大深度 二叉搜索树与双向链表 对称的二叉树

    二叉树的最大深度 二叉树中和为某一值的路径(一) 二叉搜索树与双向链表 对称的二叉树 二叉树的最大深度 描述 求给定二叉树的最大深度, 深度是指树的根节点到任一叶子节点路径上节点的数量. 最大深度是所 ...

最新文章

  1. python中实例方法分类_python方法的分类(实例方法、类方法、静态方法)
  2. 网络协议档案之ICMP、Ping、Traceroute
  3. 微信运营:必须收藏的101条万能微信标题公式
  4. Java Web之EL表达式和JSTL
  5. 替代 NetMeeting 的多人屏幕共享工具 InletexEMC 国外出品,永久免费
  6. java xps生成_Java PDF/XPS转为Word/html /SVG、PDF和XPS互转
  7. 【Code】8位编程语言的创始人,你知道几位?
  8. 如何隐藏计算机桌面窗口,电脑如何设置切换任务时可以隐藏已打开的窗口?[多图]...
  9. 循环神经网络--RNN GRU LSTM 对比分析
  10. 2019年上半年英语四、六级成绩查询方式和时间
  11. 康复期需注意什么?一组手账告诉你
  12. Attentional Factorization Machine(AFM)复现笔记
  13. 解决网页无法复制文字
  14. 微信小程序用户昵称包含表情图片的解决方案
  15. 解决Linux网络连接问题
  16. 主营女性内容生产,木棉说获A轮3000万融资
  17. 一文掌握爱因斯坦求和约定 einsum
  18. GYM雅达利打砖块环境安装
  19. C语言之计算log2
  20. STC15系列读取DS18B20温度传感器串口显示代码

热门文章

  1. 通过jQuery获取窗口的高度
  2. 用mel编写自定义节点的属性编辑器界面
  3. 编程之美2.17 数组循环移位
  4. sql server 性能分析工具
  5. web项目中用户登录的具体流程
  6. c/c++ 标准库 string
  7. java.lang.UnsatisfiedLinkError: no XXX in java.library.path
  8. 独立博客网站FansUnion.cn运营2年的经验和教训以及未来规划
  9. Temp文件夹缺少network service权限,webservice能访问,但是不能调用
  10. suse 10 下mysql安装