问题描述

将一棵二叉查找树(BST)转为有序的双向链表。

例如,有一颗BST如下:

2

|  \

1    3

转成双向链表为:

1=2=3

解决思路


1. 保持有序:中序遍历;

2. 双向链表:记录链表的头节点,遍历过程中记录前一个节点并且保持双向连接关系。

程序

class TreeNode {public int val;public TreeNode left;public TreeNode right;public TreeNode(int _val) {val = _val;}
}class BSTToDoublyLinkedList {public TreeNode convertToDoublyLinkedList(TreeNode root) {if (root == null) {return null;}TreeNode head = new TreeNode(0);TreeNode pre = new TreeNode(0);convertHelper(root, head, pre);return head.left;}private void convertHelper(TreeNode root, TreeNode head, TreeNode pre) {if (root == null) {return;}convertHelper(root.left, head, pre);if (head.left == null) {head.left = root; // record the head} if (pre.left == null) {pre.left = root;} else {pre.left.right = root;root.left = pre.left;pre.left = root; // to next}convertHelper(root.right, head, pre);}
}

  

附加测试程序:

public class ConvertTest {public static void main(String[] args) {TreeNode n2 = new TreeNode(3);n2.left = new TreeNode(1);n2.left.right = new TreeNode(2);BSTToDoublyLinkedList toDoublyLinkedList = new BSTToDoublyLinkedList();TreeNode head = toDoublyLinkedList.convertToDoublyLinkedList(n2);printDoublyLinkedList(head);}private static void printDoublyLinkedList(TreeNode head) {TreeNode node = head;TreeNode last = null;System.out.println("left --> right");while (node != null) {System.out.print(node.val + " ");if (node.right == null) {last = node;}node = node.right;}System.out.println();System.out.println("right --> left");while (last != null) {System.out.print(last.val + " ");last = last.left;}}
}

时间/空间复杂度

时间复杂度:中序遍历的时间复杂度,O(n);

空间复杂度:O(h),递归栈。

转载于:https://www.cnblogs.com/harrygogo/p/4605841.html

Solution 1: BST转双向链表相关推荐

  1. 前序中序、后序中序遍历创建二叉树,并检验是否是二叉搜索树,若是则转换为双向链表

    finalbst.h //该程序的作用是根据所给的前序序列以及中序序列或者中序序列以及后序序列创建二叉树 #include <iostream> #include <vector&g ...

  2. java 树面试题_java——二叉树面试题

    1 2 importjava.util.ArrayList;3 importjava.util.Iterator;4 importjava.util.LinkedList;5 importjava.u ...

  3. 二叉树总结挺好的很好记忆

    https://blog.csdn.net/fightforyourdream/article/details/16843303 面试大总结之二:Java搞定面试中的二叉树题目 2013年11月20日 ...

  4. 将BST转换为有序的双向链表!

    在二叉树中,每个结点都有两个指向子结点的指针. 在双向链表中, 每个结点也有两个指针,它们分别指向前一个结点和后一个结点.由于这两种结构的相似性, 同时二叉搜索树也是一种排过序的数据结构, 因此在理论 ...

  5. LeetCode 426. 将二叉搜索树转化为排序的双向链表(BST中序循环遍历)

    文章目录 1. 题目 2. 解题 1. 题目 将一个 二叉搜索树 就地转化为一个 已排序的双向循环链表 . 对于双向循环列表,你可以将左右孩子指针作为双向循环链表的前驱和后继指针,第一个节点的前驱是最 ...

  6. LeetCode 426. 将二叉搜索树转化为排序的双向链表

    将一个二叉搜索树就地转化为一个已排序的双向循环链表.可以将左右孩子指针作为双向循环链表的前驱和后继指针. 为了让您更好地理解问题,以下面的二叉搜索树为例: 我们希望将这个二叉搜索树转化为双向循环链表. ...

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

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

  8. 剑指Offer之二叉树与双向链表

    题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 解题思路 参考博客:https://www.cnblogs.com/yi- ...

  9. LeetCode简单题之两数之和 IV - 输入 BST

    题目 给定一个二叉搜索树 root 和一个目标结果 k,如果 BST 中存在两个元素且它们的和等于给定的目标结果,则返回 true. 示例 1: 输入: root = [5,3,6,2,4,null, ...

最新文章

  1. Luence简单实现1
  2. 猿辅导、作业帮忙“圈钱”,跟谁学、有道、51Talk狂“烧钱”,在线教育钱途在哪?
  3. 大数据下的BI新特性
  4. 想做硬件开发的人员必看
  5. 模式识别经典算法——FCM图像聚类分割(最简matlab实现)
  6. GUI练习——列出指定目录内容
  7. springboot配置手动提交_Spring Boot 入门教程 | 图文讲解
  8. 使用Springboot收发邮件,如此简单!
  9. 关于低版本IE浏览器无法显示图片的问题
  10. 如何UNI-APP中使用iconfont彩色图标
  11. 高德地图 toolbar
  12. Markdown里面的序列图
  13. c语言采用解释方式6,C语言程序设计题目及解答-01.doc
  14. 哲学笔记:之:天道性命
  15. net start mysql启动mysql时报错:发生系统错误 2。找不到指定文件
  16. NAXX Demo4_GZQ_01
  17. JAVA-JDBC事务基础概念及测试方法
  18. python伪造邮件发件地址_python-SMTPSenderRefused-553,发件人地址未经验证-Django电子邮件表格...
  19. 刷题总结——regular words(hdu1502 dp+高精度加法+压位)
  20. 神经网络模型结果怎么看,图像识别神经网络模型

热门文章

  1. Roman to Integer LeetCode Java
  2. 【转】【C++】__stdcall、__cdcel和__fastcall三者的区别
  3. vagrant安装及使用方法
  4. Poj2420 A Star not a Tree? 模拟退火算法
  5. How draw a stem -and -leaf amp; box-plot display by R.or Python
  6. 几个比较实用的CSS
  7. 第一章 打开MVC4的大门:(一)了解MVC
  8. 访问有用户名和密码的网络共享,实现数据导入
  9. pjsip在没有mic的情况下听到对方的声音
  10. shell中变量的取值与赋值