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

由于二叉搜索树是有序的,左子结点的值小于根节点的值,右子结点的值大于根节点的值。所以在把二叉搜索树转换成排序的双向链表的时候要把左子树中的最大值的右子树指针指向根节点,把右子树中的最小值的左子树指针指向根节点。

由于先访问根节点,因此要用中序遍历的方式进行处理。

package Solution;

public class No27ConvertBinarySearchTreeToLinkedList {

    static class BinaryTreeNode {
int value;
BinaryTreeNode left;
BinaryTreeNode right; public BinaryTreeNode() { } public BinaryTreeNode(int value, BinaryTreeNode left,
BinaryTreeNode right) {
this.value = value;
this.left = left;
this.right = right;
}
} public static BinaryTreeNode convert(BinaryTreeNode root) {
BinaryTreeNode lastNodeInList = null;
lastNodeInList = convertToNode(root, lastNodeInList);
BinaryTreeNode head = lastNodeInList;
// 从尾节点返回头结点
while (head != null && head.left != null) {
head = head.left;
}
printList(head);
return head;
} private static BinaryTreeNode convertToNode(BinaryTreeNode node,
BinaryTreeNode lastNodeInList) {
if (node == null)
return null;
BinaryTreeNode current = node;
// 递归的处理左子树
if (current.left != null)
lastNodeInList = convertToNode(current.left, lastNodeInList);
// 使链表中的最后一个结点指向左子树的最小的节点
current.left = lastNodeInList;
// 链表中的最后一个结点指向当前节点,当前节点就成了链表中的最后一个结点
if (lastNodeInList != null)
lastNodeInList.right = current;
lastNodeInList = current;
// 递归转换右子树
if (current.right != null)
lastNodeInList = convertToNode(current.right, lastNodeInList); return lastNodeInList;
} public static void printList(BinaryTreeNode head) {
while (head != null) {
System.out.print(head.value + ",");
head = head.right;
}
} // 中序遍历二叉树
public static void printTree(BinaryTreeNode root) {
if (root != null) {
printTree(root.left);
System.out.print(root.value + ",");
printTree(root.right);
}
} public static void main(String[] args) {
BinaryTreeNode node1 = new BinaryTreeNode();
BinaryTreeNode node2 = new BinaryTreeNode();
BinaryTreeNode node3 = new BinaryTreeNode();
BinaryTreeNode node4 = new BinaryTreeNode();
BinaryTreeNode node5 = new BinaryTreeNode();
BinaryTreeNode node6 = new BinaryTreeNode();
BinaryTreeNode node7 = new BinaryTreeNode();
node7.value = 16;
node6.value = 12;
node5.value = 14;
node5.left = node6;
node5.right = node7;
node3.value = 4;
node4.value = 8;
node2.value = 6;
node2.left = node3;
node2.right = node4;
node1.value = 10;
node1.left = node2;
node1.right = node5;
printTree(node1);
System.out.println();
System.out.println("=============打印链表================");
convert(node1);
}
}

剑指offer面试题27:二叉搜索树与双向链表的更多相关文章

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

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

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

    中序递归,一个pre节点记录前一个节点 /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; Tre ...

  3. 剑指Offer - 九度1503 - 二叉搜索树与双向链表

    剑指Offer - 九度1503 - 二叉搜索树与双向链表2014-02-05 23:39 题目描述: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树 ...

  4. 剑指Offer:面试题24——二叉搜索树的后序遍历序列(java实现)

    问题描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则返回true,否则返回false.假设输入的数组的任意两个数字都互不相同. 思路: 1.首先后序遍历的结果是[(左子 ...

  5. 剑指offer(26)二叉搜索树与双向链表

    题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 题目分析 要生成排序的双向列表,那么只能是中序遍历,因为中序遍历才能从小到 ...

  6. 【剑指Offer】26、二叉搜索树与双向链表

      题目描述:   输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向.   解题思路:   首先要理解此题目的含义,在双向链表中,每个结 ...

  7. 剑指Offer - 九度1367 - 二叉搜索树的后序遍历序列

    剑指Offer - 九度1367 - 二叉搜索树的后序遍历序列2013-11-23 03:16 题目描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出 ...

  8. 剑指offer(20)二叉搜索树与双向表

    题目: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 思路一:递归法 1.将左子树构造成双链表,并返回链表头节点. 2.定位至左子 ...

  9. 剑指offer(23)二叉搜索树的后序遍历序列

    题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 题目分析 1.后续遍历我们可以知道,最右边的是根节 ...

  10. 剑指offer(62)二叉搜索树的第K个节点

    题目描述 给定一棵二叉搜索树,请找出其中的第k小的结点.例如, (5,3,7,2,4,6,8)    中,按结点数值大小顺序第三小结点的值为4. 题目分析 首先,我们可以先画图.画完图后我们要想办法从 ...

随机推荐

  1. 关于vue中tamplate和DOM节点浅谈

    前言:在开发前段页面使用vue时,我们能经常看到template标签.这里粗略讲下自己对vue中template理解和使用. 1. 先了解vue vue.js是一个轻巧.高性能.壳组件画的MVVM库. ...

  2. String笔记

    String string = new String("Hello World!"); replace('e', '*') //替换字符串 String newStr = stri ...

  3. tiny4412 --Uboot移植(6) SD卡驱动,启动内核

    开发环境:win10 64位 + VMware12 + Ubuntu14.04 32位 工具链:linaro提供的gcc-linaro-6.1.1-2016.08-x86_64_arm-linux-g ...

  4. Servlet中的转发与重定向

    Sevlet 的转发与重定向都可以使得浏览器指向另一个资源文件,但它们的运行机制不相同. 一.Servlet的转发 有两种方式获得转发对象(RequestDispathcer): HttpServle ...

  5. CentOS 7 建立svn仓库 远程连接

    首先安装svn (后补) mikdir /usr/local/svn_repertory  # 创建svn大仓库用于存放所有项目代码 cd  /usr/local/svn_repertory  # 进 ...

  6. propertychange事件导致的IE浏览器堆栈溢出

    前段事件做项目,在IE下测试时,发现会报堆栈溢出的错误,其他浏览器正常,于是开始了苦逼的IE查错路程... 由于是在操作了某个输入框之后才出现的错误,所以把重点放到了input的相关事件,最终发现是这 ...

  7. Linux 查看网络状态工具

    1. iftop 效果如下图: 界面上面显示的是类似刻度尺的刻度范围,为显示流量图形的长条作标尺用的. 中间的<= =>这两个左右箭头,表示的是流量的方向. TX:发送流量RX:接收流量T ...

  8. IDEA集成git方法

    一.IDEA集成git方法 首先idea集成git我们需要先下载一个小软件,git bash  地址:https://git-scm.com/downloads  .下载好了之后直接下一步下一步傻瓜试 ...

  9. mysql 跨服务器查询

    转载地址:https://blog.csdn.net/pashine/article/details/78875540

  10. 抖音分享和授权(iOS)

    准备工作 注册appkey 抖音开放平台 集成sharesdk 下载地址 Xcode配置:urlScheme为注册的appkey, 白名单:douyinsharesdk ,douyinopensdk ...