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

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

思路一:

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

 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     }

转载于:https://www.cnblogs.com/WayneZeng/p/9290748.html

【IT笔试面试题整理】二叉搜索树转换为双向链表相关推荐

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

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

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

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

  3. 面试题27.二叉搜索树与双向链表

    题目:输入一颗二叉搜索树,将该二叉搜索树转换为一个排序的双向链表.要求不能创建 任何新的结点,只能调整树种结点指针的指向.比如输入下图的二叉搜索树,则输出转换 后的双向排序链表. 1 10 2 / \ ...

  4. 剑指Offer - 面试题36. 二叉搜索树与双向链表(中序循环/递归)

    1. 题目 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表.要求不能创建任何新的节点,只能调整树中节点指针的指向. 特别地,我们希望可以就地完成转换操作.当转化完成以后,树中节点的左指 ...

  5. leetcode —— 面试题36. 二叉搜索树与双向链表

    输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表.要求不能创建任何新的节点,只能调整树中节点指针的指向. 解题思路:二叉搜索树的特点是当前节点的左子树的值小于当前节点,当前节点的右子树的 ...

  6. 剑指offer面试题[27]-二叉搜索树与双向链表

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

  7. 剑指offer面试题36. 二叉搜索树与双向链表(中序遍历)(递归)

    题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表.要求不能创建任何新的节点,只能调整树中节点指针的指向. 思路 详见链接 代码 #class Node: # def __ini ...

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

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

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

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

最新文章

  1. java filefilter递归_Java中的递归+文件过滤器
  2. powerdesigner生成php代码,让powerdesigner生成的sql语句在mysql上成功执行
  3. python程序设计 清华大学出版社 pdf下载-清华大学出版社-图书详情-《Python程序设计》...
  4. 树状数组的区间修改+查询
  5. OpenCV鼠标事件和滑动条事件
  6. 知乎阅读三百万的生信学习指南
  7. 给定数组,去掉0元素后将剩下的元素赋给新的数组
  8. php分批处理数据,php分批更新数据
  9. 网络强制消费案例剖析
  10. Spring中的@Value注解详解
  11. Linux的setup命令启动服务名称和功能
  12. 电动车充电器原理及带电路图维修
  13. mysql自动跑sql发邮件_SQL server 表数据改变触发发送邮件的方法
  14. BUPT复试专题—密码(2009)
  15. vgremore 删除卷组
  16. Weka的下载与安装
  17. 常用的端口号(port number)
  18. Neo4j Desktop 添加算法插件Graph Algorithms
  19. 电脑蓝屏c语言代码大全,电脑蓝屏代码C0000218怎么解决方法
  20. 先决条件(一)问题定义和需求分析

热门文章

  1. 股票休市午间可以撤单吗?
  2. TrueNAS SCALE是什么
  3. 引人注目的意思是什么,怎么用引人注目造句,引人注目的近义词有哪些?
  4. 一亩地等于多少平方米?
  5. 赚钱的逻辑和赚钱的道具要发生改变
  6. 有人羡慕过自由职业吗?
  7. 别再问“自媒体怎么做”
  8. 最近发现了一条新的“致富”路
  9. 什么样的运营才是好运营?
  10. 产品迭代的节奏怎样适应需求的变化?