剑指Offer面试题27(Java版):二叉搜索树与双向链表
题目:输入一颗二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建新的结点。仅仅能调整树中结点指针的指向。
比方例如以下图中的二叉搜索树。则输出转换之后的排序双向链表为:
在二叉树中,每一个结点都有两个指向子节点的指针。在双向链表中。每一个结点也有两个指针。他们分别指向前一个结点和后一个结点。因为这两种结点的结构相似,同一时候二叉搜索树也是一种排序的数据结构。因此在理论上有可能实现二叉搜索树和排序的双向链表的转换。
在搜索二叉树中,左子结点的值总是小于父节点的值,右子节点的值总是大于父节点的值。因此我们在转换称排序的双向链表时,原先指向的左子结点的指针调整为链表中指向前一个结点的指针,原先指向右子节点的指针调整为俩表为指向后一个结点的指针。
接下来我们考虑怎样转化。
由于要求转换之后的链表是排好序的,我们可疑中序遍历树中的每个结点。这是由于中序遍历算法的特点是依照从小到达的顺序遍历二叉树的每个结点。当遍历到根节点的时候。我们把树堪称三部分:值为10的结点。根节点为6的左子树、根节点为14的右子树。
依据排序链表的定义。值为10的结点将和它的左子树的最大的一个结点(即值为8的结点)链接起来。同一时候它还将和右子树最小的结点(即值为12的结点)链接起来。如图:
依照中序遍历的顺序,当我们遍历转换到根节点(值为10的结点)时,它的左子树已经转换成一个排序的链表了,而且处在链表中的最后一个结点是当前值的最大的结点。我们把值为8的结点根节点链接起来,此时链表中的最后一个结点是10了。接着我们去遍历转换右子树,并把根节点和右子树最小的结点链接起来。
至于怎么去转换它的左子树和右子树。因为遍历和转换过程是一样的,我们自然的想到了递归。
Java代码实现:
/**
* 输入一颗二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。 * 要求不能创建不论什么新的结点。仅仅能调整树中结点指针的指向。 */
package swordForOffer; import utils.BinaryTreeNode; /**
* @author JInShuangQi
*
* 2015年8月6日
*/
public class E27ConvertBinarySearchTree {
public BinaryTreeNode convert(BinaryTreeNode root){
BinaryTreeNode node = null;
convert(root,node);
while(node != null && node.leftNode != null){
node = node.leftNode;
}
return node;
}
public void convert(BinaryTreeNode root,BinaryTreeNode lastNode){
if(root == null)
return;
BinaryTreeNode current = root;
if(current.leftNode != null)
convert(current.leftNode,lastNode);
current.leftNode = lastNode;
if(lastNode != null)
lastNode.rightNode = current;
if(current.rightNode != null)
convert(current.rightNode,lastNode);
}
}
剑指Offer面试题27(Java版):二叉搜索树与双向链表的更多相关文章
- 《剑指offer》— JavaScript(26)二叉搜索树与双向链表
二叉搜索树与双向链表 题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 思路 递归思想:把大问题转换为若干小问题: 由于Ja ...
- 剑指offer面试题14(Java版):调整数组顺序使奇数位于偶数的前面
题目:输入一个整数数组.实现一个函数来调整该数组中数字的顺序.使得全部奇数位于数组的前半部分.全部偶数位于数组的后半部分. 1.基本实现: 假设不考虑时间复杂度,最简单的思路应该是从头扫描这个数组,每 ...
- 《剑指offer》— JavaScript(23)二叉搜索树的后序遍历序列
二叉搜索树的后序遍历序列 题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 相关知识 二叉查找树(B ...
- 剑指Offer:面试题27——二叉搜索树与双向链表(java实现)
问题描述: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 思路: 将树分为三部分:左子树,根结点,右子树. 1.我们要把根结点与左 ...
- 【剑指offer 面试题27】二叉搜索树与双向链表
输入一颗二叉搜索树,将该二叉搜索树转换成一个排序的双向链表. C++: #include <iostream> using namespace std; struct TreeNode { ...
- 剑指Offer第36题—Java版
本题使用归并排序的思想,结合归并排序,写出的算法解. //数组中的逆序对 public static int InversePairs(int[] array){ if(array==null||ar ...
- 剑指offer面试题27:二叉搜索树与双向链表
题目:输入一颗二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的节点,只能调整树中节点指针的指向. 由于二叉搜索树是有序的,左子结点的值小于根节点的值,右子结点的值大于根节点的值 ...
- 剑指offer——面试题27:二叉树的镜像
函数递归 void MirrorIteratively(BinaryTreeNode* pRoot) { if(pRoot == nullptr) return; std::stack<Bina ...
- 剑指Offer22 判断数组是否为某二叉搜索树的后序遍历
/************************************************************************* > File Name: 22_Sequen ...
随机推荐
- javascript----三目运算符
flag ? $('body').addClass('hover') : $('body').removeClass('hover') ; (expr1) ? (expr2) : (expr3): 与 ...
- IPv6第二层寻址,IPv6接口要求
1. IPv6第二层寻址 IPV6地址以两种方式与第2层地址相关.第一种方式是IPV6独有的,提供了从第2层地址构建接口ID的机制.第二种方式对IPv4和IPV6都是一样的,提供了将一个IP组播地址映 ...
- java 实现多线程 3种方式
java实现多线程可以有以下三种方式: (1)继承Thread 类,重写其run()方法: (2)实现Runnable接口,实现其run() 方法: (3) 实现Callable 接口,重写call( ...
- java 截取点后面的字符串
int index = path.lastIndexOf("."); char[] ch = path.toCharArray(); //根据 copyValueOf(char[] ...
- Linux学习之计算机基础理论
一.描述计算机的组成及其功能. 计算机系统是由硬件系统(hardware)和软件系统(software system)两部分组成. 硬件系统: 从硬件基本结构上来讲,计算机是由运算器.控制器.存储器. ...
- [ZJOI2008]骑士(基环树,树形dp)
[ZJOI2008]骑士 题目描述 Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬. 最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的 ...
- Qt之QSS(动态属性)
简述 QSS可以定制应用程序的外观,无需关注Qt样式背后的魔力.从非常轻微到极其复杂的调整,样式表都可以做到.对于一个完全定制和独特的用户体验,QtQuick和QGraphicsView是更好的选择. ...
- Android数据分批载入-滑动究竟部自己主动载入列表
Android数据分批载入-滑动究竟部自己主动载入列表 2014年5月9日 摘自:<Android高级开发实战-ui.ndk与安全> 本博文介绍怎样进行数据分批载入,在应用开发其中会常常使 ...
- 每一个程序猿都应该用MBP
换笔记本的想法非常久了.前段时间换工作就想看换工作之后是什么情况吧. 可能工作配的笔记本就是MBP.后来发现是想多了,新工作的笔记本是Thinkpad X240. 配置全然够用了,8G内存+128G的 ...
- 6、python中的字符串
最早的编码为ascii码,共256个符号.UTF-8是国际通用编码,全面支持中文,以一个字节表示英文,以三个字节表示一个中文以及其他语言:GB2312是我国自己定制的中文编码标准,使用1个字节表示英文 ...