热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

剑指Offer(7)[BinaryTree]二叉搜索树转换双向链表

点击查看剑指Offer全解【Java&Golang】实现题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,

点击查看剑指Offer全解【Java & Golang】实现


题目描述

在这里插入图片描述

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




思路

第一种思路比较直观,使用一个容器收集中序遍历结果,并且将其连接成双向链表即可,这种做法会使用额外的空间复杂度。

第二种思路是通过栈实现中序遍历,在每次中序遍历过程中获取当前节点,并让当前节点和上一个节点相连,并将当前节点设置为上一个节点。这样的做法只需要中序遍历一次即可获取到双线链表,并且不需要使用容器存储整个链表,节约空间。




Java第一种解法【额外的空间复杂度】

/**
public class TreeNode {int val = 0;TreeNode left = null;TreeNode right = null;public TreeNode(int val) {this.val = val;}
}
*/

import java.util.*;
public class Solution {public TreeNode Convert(TreeNode root) {if (root &#61;&#61; null) {return null;}// 中序遍历获取到排序的树节点数组ArrayList<TreeNode> list &#61; new ArrayList<>();inorder(root, list);// 将中间部分节点依次首位连接for (int i &#61; 1; i < list.size() - 1; i&#43;&#43;) {TreeNode node &#61; list.get(i);node.left &#61; list.get(i - 1);node.right &#61; list.get(i &#43; 1);}// 处理头节点list.get(0).left &#61; null;list.get(0).right &#61; (list.size() > 1) ? list.get(1) : null;// 处理尾节点list.get(list.size() - 1).left &#61; (list.size() > 1) ? list.get(list.size() - 2) : null;list.get(list.size() - 1).right &#61; null;return list.get(0);}private void inorder(TreeNode root, ArrayList<TreeNode> list) {if (root &#61;&#61; null) {return;}inorder(root.left, list);list.add(root);inorder(root.right, list);}
}

Java第二种解法【使用栈做中序遍历】

/**
public class TreeNode {int val &#61; 0;TreeNode left &#61; null;TreeNode right &#61; null;public TreeNode(int val) {this.val &#61; val;}}
*/

import java.util.*;
public class Solution {public TreeNode Convert(TreeNode root) {if (root &#61;&#61; null) {return null;}// 中序遍历获取到排序的树节点数组TreeNode res &#61; null;TreeNode pre &#61; null;boolean first &#61; true;Stack<TreeNode> stack &#61; new Stack<>();while (!stack.isEmpty() || root !&#61; null) {if (root !&#61; null) {stack.push(root);root &#61; root.left;} else {TreeNode pop &#61; stack.pop();if (first) {// 是第一个节点res &#61; pop;pre &#61; pop;pop.left &#61; null;first &#61; false;} else {// 是中间节点或尾节点&#xff0c;前后相连pre.right &#61; pop;pop.left &#61; pre;// 将当前节点置为前一个节点pre &#61; pop;}root &#61; pop.right;}}return res;}
}

推荐阅读
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 集合的遍历方式及其局限性
    本文介绍了Java中集合的遍历方式,重点介绍了for-each语句的用法和优势。同时指出了for-each语句无法引用数组或集合的索引的局限性。通过示例代码展示了for-each语句的使用方法,并提供了改写为for语句版本的方法。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • importjava.util.ArrayList;publicclassPageIndex{privateintpageSize;每页要显示的行privateintpageNum ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 标题: ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
author-avatar
耶丝儿小丶姐
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有