题目

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

二叉树节点的定义如下:

public static class TreeNode {public int val;public TreeNode left;public TreeNode right;public TreeNode(int x) { val = x; }
}

分析

众所周知,中序遍历二叉搜索树会得到有序的序列,我们目标是在中序遍历二叉搜索树过程中,逐步将其转换成有序的双向链表。另外,将树节点的左子树指针转换成双向链表节点的前驱指针,而树节点的右子树指针转换成双向链表节点的后驱指针。

放码

import com.lun.util.BinaryTree.TreeNode;public class ConvertBSTToLinkedList {private TreeNode last;//用于指向双向链表的尾节点public TreeNode convert(TreeNode root) {convertNode(root);TreeNode head = last;while(head != null && head.left != null) {head = head.left;}return head;}private void convertNode(TreeNode node) {if(node == null) {return;}TreeNode current = node;if(current.left != null) {convertNode(current.left);}current.left = last;//1.执行到这步,左子树已经转换成有序双向链表if(last != null) {last.right = current;//2.}last = current;//3.current转换成有序双向链表的新尾节点if(current.right != null) {convertNode(current.right);}}}

测试

import org.junit.Assert;
import org.junit.Test;import com.lun.util.BinaryTree;
import com.lun.util.BinaryTree.TreeNode;public class ConvertBSTToLinkedListTest {@Testpublic void test() {ConvertBSTToLinkedList cbl = new ConvertBSTToLinkedList();TreeNode root = makeABST();TreeNode head = cbl.convert(root);Assert.assertEquals("4 -> 6 -> 8 -> 10 -> 12 -> 14 -> 16 -> \n" + "16 -> 14 -> 12 -> 10 -> 8 -> 6 -> 4 -> ", printList(head));}private TreeNode makeABST() {int[] array = {10, 6, 14, 4, 8, 12, 16};return BinaryTree.integerArray2BinarySearchTree(array);}private String printList(TreeNode head) {String result = "";TreeNode p = head;while(true) {result += (p.val + " -> ");if(p.right == null) {break;}p = p.right;}result += "\n";while(p != null) {result = result +  p.val + " -> ";p = p.left;}return result;}}

《剑指Offer》36:二叉搜索树与双向链表相关推荐

  1. 【LeetCode】剑指 Offer 36. 二叉搜索树与双向链表

    [LeetCode]剑指 Offer 36. 二叉搜索树与双向链表 文章目录 [LeetCode]剑指 Offer 36. 二叉搜索树与双向链表 package offer;//定义节点 class ...

  2. 【Java】 剑指offer(36) 二叉搜索树与双向链表

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不 ...

  3. 【LeetCode笔记】剑指 Offer 36. 二叉搜索树与双向链表(Java、二叉树、链表、原地算法)

    文章目录 题目描述 思路 && 代码 1. 非原地算法 2. 原地算法 二刷 题目描述 谈到二叉搜索树,那就得考虑考虑中序遍历啦- 这道题对中序遍历的理解提升很有好处! 思路 & ...

  4. [剑指offer] 36. 二叉搜索树与双向链表

    题目 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表.要求不能创建任何新的节点,只能调整树中节点指针的指向. 需要返回双向链表最左侧的节点. 思路 1 排序链表:利用二叉搜索树的中序遍 ...

  5. 【算法】剑指 Offer 36. 二叉搜索树与双向链表

    1.概述 地址:https://leetcode-cn.com/problems/er-cha-sou-suo-shu-yu-shuang-xiang-lian-biao-lcof/ /* // De ...

  6. 2021-08-19剑指 Offer 36. 二叉搜索树与双向链表

    我的思路: 前序遍历保证链表的有序性,并且在这个遍历的同时调整指针的指向 class Solution {public:Node* treeToDoublyList(Node* root) {if(r ...

  7. 【剑指offer】二叉搜索树转双向链表,C++实现

    原创博文,转载请注明出处! # 题目 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 二叉树节点的定义 struct TreeNod ...

  8. 剑指offer之二叉搜索树和双向链表

    1 问题 比如我们搜索二叉树如下,我们需要变成双向链表 2 分析 我们知道这个变成双向链接的时候是按照树的中序遍历打印的,我们只需要在中序遍历打印的时候操作该节点,我们可以用临时变量保存这个节点,同时 ...

  9. 【LeetCode】剑指 Offer 33. 二叉搜索树的后序遍历序列

    [LeetCode]剑指 Offer 33. 二叉搜索树的后序遍历序列 文章目录 [LeetCode]剑指 Offer 33. 二叉搜索树的后序遍历序列 package offer;public cl ...

  10. 【LeetCode】剑指 Offer 54. 二叉搜索树的第k大节点

    [LeetCode]剑指 Offer 54. 二叉搜索树的第k大节点 文章目录 [LeetCode]剑指 Offer 54. 二叉搜索树的第k大节点 一.中序遍历(提前返回) 一.中序遍历(提前返回) ...

最新文章

  1. rsyslog的学习
  2. the serveice mysql_解决重启MySQL数据库The server quit without updating PID file问题
  3. 补码(为什么按位取反再加一):告诉你一个其实很简单的问题
  4. Linux 进程(二) 进程地址空间
  5. ASP.NET Core Filter与IOC的羁绊
  6. 【空间数据库】Windows操作系统PostgreSQL+PostGIS环境搭建图文安装教程
  7. 报名开始!第二届中国移动“梧桐杯”大数据应用创新大赛邀你夺52w大奖!
  8. linux测试硬盘的ipos,Linux/Unix平台data-recovery常用的工具
  9. 安卓改机技术揭秘(一) 工具篇
  10. 计算机安装Hp1005打印机,hp1005打印机驱动安装使用方法 常见问题解答分享
  11. DiscuzQ_V3二次开发版本部署文档
  12. C++(11):显示删除函数=delete
  13. libvirt live migration 流程
  14. python精彩语句(来日方长,慢慢录入)
  15. 剑桥大学计算机专业博士几年毕业,剑桥大学学制是几年
  16. 时间触发以太网TTE
  17. 在keil MDK中定义非初始化(noini)变量
  18. 微信小程序开发-微信支付之免密支付(自动扣费)一 小程序+java接口
  19. Android蓝牙打印机功能开发完整Demo
  20. 用HijackThis轻松去除Win XP任务栏里的蓝色五角星

热门文章

  1. java中domain什么意思_java解析URL中domain、端口和协议的两种方法
  2. java内部类外部类_Java内部类:如何在内部类中返回外部类对象
  3. 【转】ABP源码分析二十四:Notification
  4. 【转】VS编译环境命令窗口中的命令
  5. ASP.NET Core真实管道详解[2]:Server是如何完成针对请求的监听、接收与响应的【上】
  6. CSS块级元素、内联元素概念
  7. ABP入门系列(14)——应用BootstrapTable表格插件
  8. SpringCloud:学习Docker安装zookeeper,注册服务
  9. 【JS 逆向百例】webpack 改写实战,G 某游戏 RSA 加密
  10. Python3 爬虫学习笔记 C03 【Ajax 数据爬取】