【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", 微软雅黑, & ...
随机推荐
- Hdu1016 Prime Ring Problem(DFS) 2016-05-06 14:27 329人阅读 评论(0) 收藏
Prime Ring Problem Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- SurfaceView+MediaPlayer播放视频
SurfaceView拥有独立的绘图表面,因此SurfaceView的UI就可以在一个独立的线程中进行行绘制.又由于不占用主线程资源,SurfaceView一方面可以实现复杂而高效的UI,另一方面又不 ...
- 团队项目第6周 - Alpha阶段项目复审 - 天冷记得穿秋裤队
团队项目第六周 - Alpha阶段项目复审 - 天冷记得穿秋裤队 经小组讨论得出以下排名 小组 优点 缺点,bug报告 最终名次 冲鸭队 一款融合了2048和俄罗斯方块的小游戏,题材十分新颖,游戏充满 ...
- 在Delphi中处理word文档与数据库的互联
在Delphi中处理word文档与数据库的互联 ---- 目前,Delphi被越来越多的人选中作为MIS系统开发中的前台工具.在以Delphi为前台,一些大型数据库为后台的MIS系统中,图形的处理不可 ...
- 省市区三级联动picker-view-微信小程序
这个是微信小程序的picker-view组件,开发的省市区3级联动,体验还不错,就分享给大家了, 此版本的省市区数据为本地JS数据,免去请求加载数据了,大家直接看源码,先看下面的动图: 项目地址: ...
- MySQL--Ansible推送密钥实现免密码登录
从别人网站抄过来,保留自用 场景: 对于需要管理的很多linux服务器,每次登录都输入密码比较痛苦,配置一个跳板机,将本地公钥推送带各访问节点上实现SSH登录 登录账号:admin 本地秘钥路径:/h ...
- 【vue】项目编译报错‘npm ERR! **@**dev: `webpack-dev-server --inline --progress --config ’’
关于npm ERR! **@**dev: `webpack-dev-server --inline --progress --config‘ 原因:这是新版webpack存在的BUG,卸载现有的新版本 ...
- prometheus比zabbix好在哪点?
分享网易云轻舟微服务选择基于 Prometheus 开发微服务监控系统的考量: 开源 云原生 与微服务监控需求的匹配度很高 开源 Prometheus是CNCF(云原生计算基金会)旗下成熟的开源项目, ...
- ceph 源码安装 configure: error: "Can't find boost spirit headers"
问题:configure: error: "Can't find boost spirit headers" 解决: 推荐:sudo apt-get install libboos ...
- 连接dubbox注册中心的端口默认是20880
pyg服务工程 都没用到20880 都没用默认,从20881 开始用,第二个服务工程 的则为20882 <dubbo:protocol name="dubbo" port= ...