《剑指Offer》36:二叉搜索树与双向链表
题目
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。比如,输入下图中的二叉搜索树,输出转换之后的排序双向链表。
二叉树节点的定义如下:
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:二叉搜索树与双向链表相关推荐
- 【LeetCode】剑指 Offer 36. 二叉搜索树与双向链表
[LeetCode]剑指 Offer 36. 二叉搜索树与双向链表 文章目录 [LeetCode]剑指 Offer 36. 二叉搜索树与双向链表 package offer;//定义节点 class ...
- 【Java】 剑指offer(36) 二叉搜索树与双向链表
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不 ...
- 【LeetCode笔记】剑指 Offer 36. 二叉搜索树与双向链表(Java、二叉树、链表、原地算法)
文章目录 题目描述 思路 && 代码 1. 非原地算法 2. 原地算法 二刷 题目描述 谈到二叉搜索树,那就得考虑考虑中序遍历啦- 这道题对中序遍历的理解提升很有好处! 思路 & ...
- [剑指offer] 36. 二叉搜索树与双向链表
题目 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表.要求不能创建任何新的节点,只能调整树中节点指针的指向. 需要返回双向链表最左侧的节点. 思路 1 排序链表:利用二叉搜索树的中序遍 ...
- 【算法】剑指 Offer 36. 二叉搜索树与双向链表
1.概述 地址:https://leetcode-cn.com/problems/er-cha-sou-suo-shu-yu-shuang-xiang-lian-biao-lcof/ /* // De ...
- 2021-08-19剑指 Offer 36. 二叉搜索树与双向链表
我的思路: 前序遍历保证链表的有序性,并且在这个遍历的同时调整指针的指向 class Solution {public:Node* treeToDoublyList(Node* root) {if(r ...
- 【剑指offer】二叉搜索树转双向链表,C++实现
原创博文,转载请注明出处! # 题目 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 二叉树节点的定义 struct TreeNod ...
- 剑指offer之二叉搜索树和双向链表
1 问题 比如我们搜索二叉树如下,我们需要变成双向链表 2 分析 我们知道这个变成双向链接的时候是按照树的中序遍历打印的,我们只需要在中序遍历打印的时候操作该节点,我们可以用临时变量保存这个节点,同时 ...
- 【LeetCode】剑指 Offer 33. 二叉搜索树的后序遍历序列
[LeetCode]剑指 Offer 33. 二叉搜索树的后序遍历序列 文章目录 [LeetCode]剑指 Offer 33. 二叉搜索树的后序遍历序列 package offer;public cl ...
- 【LeetCode】剑指 Offer 54. 二叉搜索树的第k大节点
[LeetCode]剑指 Offer 54. 二叉搜索树的第k大节点 文章目录 [LeetCode]剑指 Offer 54. 二叉搜索树的第k大节点 一.中序遍历(提前返回) 一.中序遍历(提前返回) ...
最新文章
- rsyslog的学习
- the serveice mysql_解决重启MySQL数据库The server quit without updating PID file问题
- 补码(为什么按位取反再加一):告诉你一个其实很简单的问题
- Linux 进程(二) 进程地址空间
- ASP.NET Core Filter与IOC的羁绊
- 【空间数据库】Windows操作系统PostgreSQL+PostGIS环境搭建图文安装教程
- 报名开始!第二届中国移动“梧桐杯”大数据应用创新大赛邀你夺52w大奖!
- linux测试硬盘的ipos,Linux/Unix平台data-recovery常用的工具
- 安卓改机技术揭秘(一) 工具篇
- 计算机安装Hp1005打印机,hp1005打印机驱动安装使用方法 常见问题解答分享
- DiscuzQ_V3二次开发版本部署文档
- C++(11):显示删除函数=delete
- libvirt live migration 流程
- python精彩语句(来日方长,慢慢录入)
- 剑桥大学计算机专业博士几年毕业,剑桥大学学制是几年
- 时间触发以太网TTE
- 在keil MDK中定义非初始化(noini)变量
- 微信小程序开发-微信支付之免密支付(自动扣费)一 小程序+java接口
- Android蓝牙打印机功能开发完整Demo
- 用HijackThis轻松去除Win XP任务栏里的蓝色五角星
热门文章
- java中domain什么意思_java解析URL中domain、端口和协议的两种方法
- java内部类外部类_Java内部类:如何在内部类中返回外部类对象
- 【转】ABP源码分析二十四:Notification
- 【转】VS编译环境命令窗口中的命令
- ASP.NET Core真实管道详解[2]:Server是如何完成针对请求的监听、接收与响应的【上】
- CSS块级元素、内联元素概念
- ABP入门系列(14)——应用BootstrapTable表格插件
- SpringCloud:学习Docker安装zookeeper,注册服务
- 【JS 逆向百例】webpack 改写实战,G 某游戏 RSA 加密
- Python3 爬虫学习笔记 C03 【Ajax 数据爬取】