【试题描述】 将二叉搜索树转换为双向链表

对于二叉搜索树,可以将其转换为双向链表,其中,节点的左子树指针在链表中指向前一个节点,右子树指针在链表中指向后一个节点。

思路一:

采用递归思想,对于二叉搜索树,将左、右子树分别转换为双向链表,左子树转换所得链表的头结点即整个树的头结点,左子树转换所得链表的尾节点与根节点相邻;右子树转换所得链表的尾节点即整个树的尾节点,右子树转换所得链表的头结点与根节点相邻。

 1     private static Node last;
2 public static Node treeToList(Node tree)
3 {
4 Node head;
5 // 若树为空,返回空
6 if (tree == null)
7 return null;
8
9 // 若无左子树,则该根节点为链表的头结点
10 if (tree.left == null)
11 head = tree;
12 // 若有左子树,递归调用转换函数将左子树转换为双向链表
13 // 左子树转换所得链表的头结点是整个树的头结点
14 // 左子树链表的尾结点与根节点相邻
15 else
16 {
17 head = treeToList(tree.left);
18 tree.left = last;
19 last.right = tree;
20 }
21 //若无右子树,则该根节点为链表的尾结点
22 if (tree.right == null)
23 last = tree;
24 //若有右子树,递归调用转换函数将右子树转换为双向链表
25 //右子树转换所得链表的尾结点是整个树的尾结点
26 //右子树链表的头结点与根节点相邻
27 else
28 {
29 tree.right = treeToList(tree.right);
30 tree.right.left = tree;
31 }
32 return head;
33
34 }

思路二:

我们可以中序遍历整棵树。按照这个方式遍历树,比较小的结点先访问。如果我们每访问一个结点,假设之前访问过的结点已经调整成一个排序双向链表,我们再把调整当前结点的指针将其链接到链表的末尾。当所有结点都访问过之后,整棵树也就转换成一个排序双向链表了。

 1     // /////////////////////////////////////////////////////////////////////
2 // Covert a sub binary-search-tree into a sorted double-linked list
3 // Input: pNode - the head of the sub tree
4 // pLast - the tail of the double-linked list
5 // /////////////////////////////////////////////////////////////////////
6 private static Node pLast;
7
8 public static void treeToList(Node pNode)
9 {
10 if (pNode == null)
11 return;
12 Node pCurrent = pNode;
13
14 // Convert the left sub-tree
15 if (pCurrent.left != null)
16 treeToList(pCurrent.left);
17
18 // Put the current node into the double-linked list
19 pCurrent.left = pLast;
20
21 if (pLast != null)
22 pLast.right = pCurrent;
23
24 pLast = pCurrent;
25 // Convert the right sub-tree
26 if (pCurrent.right != null)
27 treeToList(pCurrent.right);
28 }
29
30 // /////////////////////////////////////////////////////////////////////
31 // Covert a binary search tree into a sorted double-linked list
32 // Input: pHead - the head of tree
33 // Output: the head of sorted double-linked list
34 // /////////////////////////////////////////////////////////////////////
35 public static Node convertTree(Node root)
36 {
37 treeToList(root);
38
39 // Get the head of the double-linked list
40 Node pHead = pLast;
41 while (pHead != null && pHead.left != null)
42 pHead = pHead.left;
43
44 return pHead;
45
46 }

【IT笔试面试题整理】二叉搜索树转换为双向链表的更多相关文章

  1. 剑指Offer:面试题27——二叉搜索树与双向链表(java实现)

    问题描述: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 思路: 将树分为三部分:左子树,根结点,右子树. 1.我们要把根结点与左 ...

  2. 《剑指offer》面试题36. 二叉搜索树与双向链表

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

  3. 《剑指offer》面试题27 二叉搜索树与双向链表 Java版

    (将BST改成排序的双向链表.) 我的方法一:根据BST的性质,如果我们中序遍历BST,将会得到一个从小到大排序的序列.如果我们将包含这些数字的节点连接起来,就形成了一个链表,形成双向链表也很简单.关 ...

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

    中序递归,一个pre节点记录前一个节点 /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; Tre ...

  5. 剑指Offer面试题:25.二叉搜索树与双向链表

    一.题目:二叉搜索树与双向链表 题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向.比如输入下图中左边的二叉搜索树,则输出转换之后的 ...

  6. (剑指Offer)面试题27:二叉搜索树与双向链表

    题目: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 二叉树的定义如下: struct TreeNode{ int val; Tr ...

  7. 《剑指offer》第三十六题(二叉搜索树与双向链表)

    // 面试题36:二叉搜索树与双向链表 // 题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求 // 不能创建任何新的结点,只能调整树中结点指针的指向. #include < ...

  8. 剑指Offer25 二叉搜索树转换为排序双向链表

    /************************************************************************* > File Name: 25_BSTCon ...

  9. 剑指offer 二叉搜索树与双向链表

    html, body { font-size: 15px; } body { font-family: Helvetica, "Hiragino Sans GB", 微软雅黑, & ...

随机推荐

  1. noip第23课作业

    1.   营救 铁塔尼号遇险了!他发出了求救信号.距离最近的哥伦比亚号收到了讯息,时间就是生命,必须尽快赶到那里. 通过侦测,哥伦比亚号获取了一张海洋图.这张图将海洋部分分化成n*n个比较小的单位,其 ...

  2. python_运算符与表达式

    运算符与表达式 python运算符 运算符 功能说明 + 算术加法,列表.元组.字符串合并与连接,正号 - 算术减法,集合差集,相反数 * 算术乘法,序列重复 / 真除法 // 求整商,但如果操作数中 ...

  3. file新建文件及文件夹

    1.获取包名的根目录:mRootPath = getFilesDir().getParent(); // ====mRootPath===/data/data/com.yoyu.file  获取SD卡 ...

  4. spring 框架整合mybatis的源码分析

    问题:spring 在整合mybatis的时候,我们是看不见sqlSessionFactory,和sqlsession(sqlsessionTemplate 就是sqlsession的具体实现)的,这 ...

  5. 《principal component analysis based cataract grading and classification》学习笔记

    Abstract A cataract is lens opacification caused by protein denaturation which leads to a decrease i ...

  6. Delphi cxGrid使用汇总(一)

    1. 去掉cxGrid中台头的Box解决:在tableview1的ptionsview的groupbybox=false; 2.统计功能解决:(1) tableview1. tableview1的op ...

  7. mssql中按周进行表分区的方法

    创建一个包含了一个持久化计算列的表,类似于下面.然后以这个列作为分区的依据. CREATE TABLE [dbo].[test] ( ) NOT NULL , [time] [DATETIME] NU ...

  8. 完美融合 nextjs 和 antd

    相信大家在使用nextjs的时候,难免遇到一些坑.其实可能大部分原因在于 nextjs 做了很多封装,我们可能不能第一时间搞清楚包括它相关的所有配置,比如其中的webpack配置.我前面也写过 SSR ...

  9. Hibernate在PostgreSQL上执行sum函数导致数据失真的问题

    有一段通过Hibernate从PostgreSQL上进行sum统计的简单代码,但统计结果却导致数据失真,不知原因何在,求指教! Java代码片段如下: public List<Object> ...

  10. 使用WPF制作视频监控多画面切换

    前言 曾有做过一个产品,有一个功能是视频监控模块,视频监控首先想到的是视频多画面切换功能,由于前端是用WPF开发的,所以当时就做了一个多画面切换组件,效果如下: 功能设计前提: 由于要使用海康大华天地 ...