【IT笔试面试题整理】二叉搜索树转换为双向链表
【试题描述】 将二叉搜索树转换为双向链表
对于二叉搜索树,可以将其转换为双向链表,其中,节点的左子树指针在链表中指向前一个节点,右子树指针在链表中指向后一个节点。

思路一:
采用递归思想,对于二叉搜索树,将左、右子树分别转换为双向链表,左子树转换所得链表的头结点即整个树的头结点,左子树转换所得链表的尾节点与根节点相邻;右子树转换所得链表的尾节点即整个树的尾节点,右子树转换所得链表的头结点与根节点相邻。
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笔试面试题整理】二叉搜索树转换为双向链表的更多相关文章
- 剑指Offer:面试题27——二叉搜索树与双向链表(java实现)
问题描述: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 思路: 将树分为三部分:左子树,根结点,右子树. 1.我们要把根结点与左 ...
- 《剑指offer》面试题36. 二叉搜索树与双向链表
问题描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表.要求不能创建任何新的节点,只能调整树中节点指针的指向. 为了让您更好地理解问题,以下面的二叉搜索树为例: 我们希望将这个二叉搜 ...
- 《剑指offer》面试题27 二叉搜索树与双向链表 Java版
(将BST改成排序的双向链表.) 我的方法一:根据BST的性质,如果我们中序遍历BST,将会得到一个从小到大排序的序列.如果我们将包含这些数字的节点连接起来,就形成了一个链表,形成双向链表也很简单.关 ...
- 剑指offer 面试题36.二叉搜索树与双向链表
中序递归,一个pre节点记录前一个节点 /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; Tre ...
- 剑指Offer面试题:25.二叉搜索树与双向链表
一.题目:二叉搜索树与双向链表 题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向.比如输入下图中左边的二叉搜索树,则输出转换之后的 ...
- (剑指Offer)面试题27:二叉搜索树与双向链表
题目: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 二叉树的定义如下: struct TreeNode{ int val; Tr ...
- 《剑指offer》第三十六题(二叉搜索树与双向链表)
// 面试题36:二叉搜索树与双向链表 // 题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求 // 不能创建任何新的结点,只能调整树中结点指针的指向. #include < ...
- 剑指Offer25 二叉搜索树转换为排序双向链表
/************************************************************************* > File Name: 25_BSTCon ...
- 剑指offer 二叉搜索树与双向链表
html, body { font-size: 15px; } body { font-family: Helvetica, "Hiragino Sans GB", 微软雅黑, & ...
随机推荐
- 关于 Keil uVision2 中文注释会显示不完整,字体不正常的问题
在Keil中添加中文注释经常出现这样情况: ,注释文字不正常! 解决方案:Edit---->Option----->选择color&fonts选项卡中的Editor c Files ...
- ORACLE中的FTP例子代码
http://blog.csdn.net/mashengwang/article/details/5982663 CREATE OR REPLACE DIRECTORY my_docs AS '/u0 ...
- Java 学习的几个基础实验(Learn by doing)
0 引子 不少情况下,学生连开发环境都搭建不好,有了实验楼,这个问题基本就解决了. 实验楼是国内首家IT在线实训平台,拥有最丰富的计算机在线实验课,而且全部免费.创业团队对师生的服务非常贴心细致. 1 ...
- mssql中按周进行表分区的方法
创建一个包含了一个持久化计算列的表,类似于下面.然后以这个列作为分区的依据. CREATE TABLE [dbo].[test] ( ) NOT NULL , [time] [DATETIME] NU ...
- [LintCode] Permutations
http://www.lintcode.com/en/problem/permutations/# Given a list of numbers, return all possible permu ...
- VS2015下安装Entity Framework Power Tools
Entity Framework Power Tools是一个由EntityFramework开发小组提供的工具,它可以从现有数据库生成Fluent款式的Code First代码. 怀着激动的心情安装 ...
- 微服务统一登陆认证怎么做?JWT ?
无状态登录原理 1.1.什么是有状态? 有状态服务,即服务端需要记录每次会话的客户端信息,从而识别客户端身份,根据用户身份进行请求的处理,典型的设计如tomcat中的session. 例如登录:用户登 ...
- SpringCloud之Fegin
Fegin是一个声明似的web服务客户端,它使得编写web服务客户端变得更加容易.使用Fegin创建一个接口并对它进行注解.它具有可插拔的注解支持包括Feign注解与JAX-RS注解,Feign还支持 ...
- day 72 crm(9) 客户关系系统,整体实现,以及自定制路由内容,客户关系梳理
前情提要: crm(9) ,利用stark 组件和,rbac组键的使用, 明确观点: 一:客户关系需求明确 1:客户关系系统,主要是,本业务逻辑主要是 销售就客户关系的业务逻辑, 二: 创建ap ...
- element-ui table 最后一行合计,单元格合并
接着写两个方法--最后一行合计的方法 --单元格合并的方法 先写一个rowspan方法,计算出spanArr数组是怎么单元格合并的,注意rowspan方法要在渲染完成之前使用,可以在mounted中使 ...