《剑指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;}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/445857.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

窗口位置按钮取消_VBA002:“宏”的保存位置有哪几种方式?

商务合作请加微信 | Allen_Lyq文章投稿 | jiangjunpeng1996126.com微信公众号 | Word和Excel达人先生头条号 | 跟小小筱学办公技能通过上一篇文章的学习,我们已经知道宏的基本用法,在录制宏的过程中,还有几个点需要我们注意下:宏命…

《剑指Offer》60:n个骰子的点数

题目 把n个骰子扔在地上,所有骰子朝上一面的点数之和为S。输入n,打印出S的所有可能的值出现的概率。 分析 直接法 假设骰子有face面,有n个骰子,那么总排列数就有faceⁿ个。(例如,有3个6面骰子&#xff…

fastjson解析多层数据_怎么解析三层List json数据

注意这个json格式不对前后的 [ ] 应该要去掉。 (我不是说你缺少的结束符)FastJSON 随意解决的事情。0, compile com.alibaba:fastjson:1.2.71,去这个网站 http://www.jsonschema2pojo.org/粘贴你的json字符串1.1 Source type:JSON1.2 Annotation style:NONE1.3 所有…

《剑指Offer》37:序列化二叉树

题目 请实现两个函数,分别用来序列化和反序列化二叉树。 分析 我们清楚可以通过前序遍历序列和中序遍历序列创造出一棵二叉树。因此,我们可以先把一棵二叉树序列化成一个前序遍历序列和一个中序遍历序列,然后在反序列化时通过这两种序列还…

c linux 判断ip合法_shell 检测ip的合法性与检测网络掩码的合法性

有时我们需要检测IP输入的正确性与网络掩码的正确性,用shell脚本写的:#验证ip地址的正确性check_ip_format(){echo $1 | grep "^[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}$" > /dev/nullif [ $? 1 ]; thenreturn 1elseaec…

《剑指Offer》38:字符串的排列

题目 输入一个字符串,打印该字符中字符的所有排列。 例如,输入字符串abc,则打印出由字符a、b、c所能排列出来的所有字符串有abc、acb、bac、bca、cab、cba 分析 把一个字符串看成由两部分组成:第一部分是它的第一个字符&#…

含有js的英文单词_JavaScript 常用单词整理

JS单词push :添加一个数组元素document :文档pop :删除最后一个数组元素console :控制台shift :删除第一个数组元素string :字符串Concat 组合数组undefined :未定义typeof :关键字join&#xf…

《剑指Offer》23:链表中环的入口节点

题目 若一个链表中包含环,如何找出的入口结点?如下图链表中,环的入口节点的节点3。 分析 一快(移两节点)一慢(移一节点)两指针判断链表是否存在环。算出环有几个节点(上一步的两指…

mysql数据库上机题_MYSQL数据库练习题操作(select)大全

1、 查询Student表中的所有记录的Sname、Ssex和Class列。select sname,ssex,class fromstudent;2、查询教师所有的单位即不重复的Depart列。select distinct depart fromteacher;3、 查询Student表的所有记录。select * fromstudent;4、 查询Score表中成绩在60到80之间的所有记…

Java中<? super T>和List<? extends T>的区别

Java中<? super T>和List<? extends T>的区别 <? extends T> 下面通配符声明List<? extends Number> foo3的赋值式是合法的&#xff1a; List<? extends Number> foo3 new ArrayList<Number>(); // Number "extends" …

mysql书写规则_每天10分钟带你学会MySQL(二)SQL语句的基本书写规则

SQL语句时必须要遵守一些规则。这些规则都非常简单&#xff0c;接下来就让我们逐一认识一下吧。1&#xff0c;SQL语句以分号(;)结尾。■SQL语句要以分号(;)结 尾一条SQL语句可以描述一个数据库操作。在RDBMS当中&#xff0c;SQL语句也是逐条执行的。众所周知&#xff0c;我们在…

《剑指Offer》52:两个链表的第一个公共节点

题目 输入两个链表&#xff0c;找出它们的第一个公共节点。 public static class ListNode{public int val;public ListNode next;public ListNode(int val) {this.val val;} }分析 首先遍历两链表的长度。在第二次遍历的时候&#xff0c;在较长的链表上先走若干步&#xf…

mysql win 64_win10下装mysql-5.7.18-winx64

步骤1官网下载地址&#xff1a;https://dev.mysql.com/downloads/mysql/选择手动安装版&#xff1a;解压到D盘mysql文件夹下&#xff1a;比以往的版本里缺少了两个.ini文件&#xff0c;直接copy过来&#xff0c;进行修改,my.ini&#xff1a;[client]port3306default-character-…

《剑指Offer》62:圆圈中最后剩下的数字(约瑟夫环)

题目 0,1,2…,n-1这n个数字排成一个圆圈&#xff0c;从数字0开始&#xff0c;每次从这圆圈你删除第m个数字。求出这个圆圈里剩下的最后一个数字。 例如&#xff0c;0、1、2、3、4这5个数字组成一个圆圈&#xff0c;从数字0开始每次删除第3个数字&#xff0c;则删除的前4个数字…

mysql数据库老是被锁怎么解决_Mysql数据库全局锁是如何引起的,如何解决?

2019-01-08 回答乐观锁与悲观锁不同的是&#xff0c;它是一种逻辑上的锁&#xff0c;而不需要数据库提供锁机制来支持当数据很重要&#xff0c;回滚或重试一次需要很大的开销时&#xff0c;需要保证操作的acid性质&#xff0c;此时应该采用悲观锁而当数据对即时的一致性要求不高…

我们边吃曲奇边聊——Cookie与Session那些事

Cookie与Session分别是什么&#xff1f; HTTP Cookie&#xff08;也叫 Web Cookie 或浏览器 Cookie&#xff09;是服务器发送到用户浏览器并保存在本地的一小块数据&#xff0c;它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。 通常&#xff0c;它用于告知…

mysql 不能添加外键 1215_MySQL错误1215:无法添加外键约束

我正在尝试将新模式转发工程到我的数据库服务器上&#xff0c;但是我不知道为什么会收到此错误。我试图在这里搜索答案&#xff0c;但是我发现的所有内容都说是将db引擎设置为Innodb或确保要用作外键的键是它们自己表中的主键。如果我没记错的话&#xff0c;我都做过这两件事。…

JMH初体验

什么是JMH JMH是 Java Microbenchmark Harness 的缩写。中文意思大致是 “JAVA 微基准测试套件”。 基准测试是指通过设计科学的测试方法、测试工具和测试系统&#xff0c;实现对一类测试对象的某项性能指标进行定量的和可对比的测试。——百度百科 为什么要使用 JMH 基准测试…

java map取第一个元素_Java Set接口 Map 与枚举

Set接口概述一个不包含重复元素的 collection。更确切地讲&#xff0c;set 不包含满足 e1.equals(e2) 的元素对 e1 和 e2&#xff0c;并且最多包含一个 null 元素特点Set接口是无序的 Set 是继承于Collection的接口。它是一个不允许有重复元素的集合。Set可以存储null值,但是nu…

Python中yield简单用法

Python中yield简单用法 你或许知道带有yield的函数在Python中被称之为generator&#xff0c;那何为 generator&#xff1f; 我们暂时抛开generator&#xff0c;先从一个常见编程题目开始&#xff0c;循序渐进了解yield的概念。 生成Fibonacci数列 Fibonacci数列是一个经典递…