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

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

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

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);}
}

转载于:https://www.cnblogs.com/gl-developer/p/7296550.html

剑指offer面试题27:二叉搜索树与双向链表相关推荐

  1. 剑指offer面试题[27]-二叉搜索树与双向链表

    题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. /* struct TreeNode {int val;struct Tr ...

  2. 剑指Offer - 面试题36. 二叉搜索树与双向链表(中序循环/递归)

    1. 题目 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表.要求不能创建任何新的节点,只能调整树中节点指针的指向. 特别地,我们希望可以就地完成转换操作.当转化完成以后,树中节点的左指 ...

  3. 剑指offer面试题36. 二叉搜索树与双向链表(中序遍历)(递归)

    题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表.要求不能创建任何新的节点,只能调整树中节点指针的指向. 思路 详见链接 代码 #class Node: # def __ini ...

  4. 剑指Offer - 面试题33. 二叉搜索树的后序遍历序列(递归)

    1. 题目 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果.如果是则返回 true,否则返回 false.假设输入的数组的任意两个数字都互不相同. 参考以下这颗二叉搜索树:5/ \2 6 ...

  5. 剑指Offer - 面试题54. 二叉搜索树的第k大节点(二叉树循环遍历)

    1. 题目 给定一棵二叉搜索树,请找出其中第k大的节点. 示例 1: 输入: root = [3,1,4,null,2], k = 13/ \1 4\2 输出: 4示例 2: 输入: root = [ ...

  6. 剑指offer面试题54. 二叉搜索树的第k大节点(逆中序遍历)

    题目描述 给定一棵二叉搜索树,请找出其中第k大的节点. 思路 详见链接 代码 class Solution:def kthLargest(self, root:TreeNode, k:int)-> ...

  7. 剑指offer面试题33. 二叉搜索树的后序遍历序列(二叉树)(递归)

    题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果.如果是则返回 true,否则返回 false.假设输入的数组的任意两个数字都互不相同. 思路 详见链接 代码 class Sol ...

  8. 《剑指Offer》36:二叉搜索树与双向链表

    题目 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的节点,只能调整树中节点指针的指向.比如,输入下图中的二叉搜索树,输出转换之后的排序双向链表. 二叉树节点的定义如下 ...

  9. 剑指offer(C++)-JZ36:二叉搜索树与双向链表(数据结构-树)

    作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.如下图所示 数据范围:输 ...

  10. 剑指offer(牛客)---26.二叉搜索树与双向链表

    题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. /** public class TreeNode {int val = ...

最新文章

  1. python如何改颜色_python和networkx:如何更改节点的颜色
  2. python 生成列向量_python_mmdt:一种基于敏感哈希生成特征向量的python库(一)
  3. python的特征提取实验一_在opencv3中使用ORB进行特征提取实验-Python版
  4. CocoaPods pod install/pod update更新慢的问题
  5. CSS Margin(外边距)
  6. 干得漂亮!法院在微信朋友圈精准投放“老赖”广告 网友:建议全国推广
  7. 【Elasticsearch】ES 5.6.4源码解析---translog
  8. 问题 F: 编写函数:一维数组的逆序 (Append Code)
  9. oracle 对象仕途,“事业型”凤凰男为了仕途不顾家,妻子的选择让他措手不及...
  10. 解决Navicat连接MySQL总是报错1251的方法
  11. mysql 执行时间有波动_阿里P8架构师谈mysql性能优化思路
  12. 没有学历可以学计算机编程吗,学电脑编程要什么学历?
  13. torchdiffeq中odeint函数的输入输出参数分析
  14. oracle svip地址,木子李QQ8.9 显IP地址SVIP完整版
  15. 思科2960交换机telnet连接配置
  16. vs2022 E1696 无法打开 源 文件 “string.h“
  17. 一点点的社会经济学和组织领导学
  18. 【安全资讯】最高法:禁止滥用人脸识别,新规定8月1日起施行
  19. java怎样实现下载模板
  20. opengl 摄像头移动

热门文章

  1. 从架构到源码:一文了解Flutter渲染机制
  2. Oracle 数据库启动 startup和startup force的区别
  3. 虚拟机安装CentOS,网络配置
  4. 游戏设计、原型与开发:基于Unity与C#从构思到实现pdf
  5. 51nod 1277 KMP 前缀出现次数
  6. Exercise 42: Is-A, Has-A, Objects, and Classes
  7. XBMC 最新版本错误
  8. [置顶]信息发布系统 Jquery+MVC架构开发(7) Controller层
  9. linux web服务器系统优化,Ubuntu WEB服务器参数优化
  10. hibernate mysql 映射_Hibernate怎么不用配置mapping就使用数据库表映射实体