题目:输入一颗二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建新的结点。仅仅能调整树中结点指针的指向。

比方例如以下图中的二叉搜索树。则输出转换之后的排序双向链表为:

在二叉树中,每一个结点都有两个指向子节点的指针。在双向链表中。每一个结点也有两个指针。他们分别指向前一个结点和后一个结点。因为这两种结点的结构相似,同一时候二叉搜索树也是一种排序的数据结构。因此在理论上有可能实现二叉搜索树和排序的双向链表的转换。

在搜索二叉树中,左子结点的值总是小于父节点的值,右子节点的值总是大于父节点的值。因此我们在转换称排序的双向链表时,原先指向的左子结点的指针调整为链表中指向前一个结点的指针,原先指向右子节点的指针调整为俩表为指向后一个结点的指针。

接下来我们考虑怎样转化。

由于要求转换之后的链表是排好序的,我们可疑中序遍历树中的每个结点。这是由于中序遍历算法的特点是依照从小到达的顺序遍历二叉树的每个结点。当遍历到根节点的时候。我们把树堪称三部分:值为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版):二叉搜索树与双向链表的更多相关文章

  1. 《剑指offer》— JavaScript(26)二叉搜索树与双向链表

    二叉搜索树与双向链表 题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 思路 递归思想:把大问题转换为若干小问题: 由于Ja ...

  2. 剑指offer面试题14(Java版):调整数组顺序使奇数位于偶数的前面

    题目:输入一个整数数组.实现一个函数来调整该数组中数字的顺序.使得全部奇数位于数组的前半部分.全部偶数位于数组的后半部分. 1.基本实现: 假设不考虑时间复杂度,最简单的思路应该是从头扫描这个数组,每 ...

  3. 《剑指offer》— JavaScript(23)二叉搜索树的后序遍历序列

    二叉搜索树的后序遍历序列 题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 相关知识 二叉查找树(B ...

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

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

  5. 【剑指offer 面试题27】二叉搜索树与双向链表

    输入一颗二叉搜索树,将该二叉搜索树转换成一个排序的双向链表. C++: #include <iostream> using namespace std; struct TreeNode { ...

  6. 剑指Offer第36题—Java版

    本题使用归并排序的思想,结合归并排序,写出的算法解. //数组中的逆序对 public static int InversePairs(int[] array){ if(array==null||ar ...

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

    题目:输入一颗二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的节点,只能调整树中节点指针的指向. 由于二叉搜索树是有序的,左子结点的值小于根节点的值,右子结点的值大于根节点的值 ...

  8. 剑指offer——面试题27:二叉树的镜像

    函数递归 void MirrorIteratively(BinaryTreeNode* pRoot) { if(pRoot == nullptr) return; std::stack<Bina ...

  9. 剑指Offer22 判断数组是否为某二叉搜索树的后序遍历

    /************************************************************************* > File Name: 22_Sequen ...

随机推荐

  1. React+Webpack+ES6环境搭建(自定义框架)

    引言 目前React前端框架是今年最火的.而基于React的React Native也迅速发展.React有其独特的组件化功能与JSX的新语法,帮助前端设计有了更好的设计与便捷,而React Nati ...

  2. Redis散杂记

    Redis是一款很火的KV模式的内存数据库,与众不同的特点: 1.数据存储在内存 内存的读取速度仅次于CPU的寄存器.各等级缓存,“英雄”自动敏捷属性,特点就是快.高效.因此不需要类似存储磁盘的数据库 ...

  3. fwupdate-efi 与 grub2-common 冲突

    在CentOS-7Minimal系统中使用命令如下命令yum groupinstall -y "GNOME Desktop"安装 图形界面时提示:fwupdate-efi 与 gr ...

  4. PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql

    在一般的 Server 程序中都会有一些耗时的任务,比如:发送邮件.聊天服务器发送广播等.如果我们采用同步阻塞的防水去执行这些任务,那么这肯定会非常的慢. Swoole 的 TaskWorker 进程 ...

  5. (50)与magento集成

    我对接的是 odoo8 和 magento1.9.x 准备工作: l  服务器 装上mangento 组件 : $  pip install magento 装上 requests 组件:$ pip ...

  6. LaTeX 表格

    本系列文章由 @YhL_Leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/50066137 一些LaTeX中表格的使 ...

  7. hdu 2102 A计划 具体题解 (BFS+优先队列)

    题目链接:pid=2102">http://acm.hdu.edu.cn/showproblem.php?pid=2102 这道题属于BFS+优先队列 開始看到四分之中的一个的AC率感 ...

  8. python Flask 学前班

    0.Flask简单介绍     Flask是一个用Python编写的轻量级的Web应用框架.本文第一部分将简单解说Flask的安装,接着展示一个Flask的样例,第一个样例非常easy但也存在缺陷-- ...

  9. 递归神经网络——就是解决AST这样的问题

    原文:https://zybuluo.com/hanbingtao/note/626300 有时候把句子看做是词的序列是不够的,比如下面这句话『两个外语学院的学生』: 上图显示了这句话的两个不同的语法 ...

  10. poj--2083--Fractal(dfs)

    Fractal Time Limit: 1000MS   Memory Limit: 30000KB   64bit IO Format: %I64d & %I64u Submit Statu ...