Java实题演练二叉搜索树与双向链表分析

 更新时间:2022年12月05日 08:32:01   作者:敲代码の流川枫  
这篇文章主要介绍了Java二叉搜索树与双向链表,总的来说这并不是一道难题,那为什么要拿出这道题介绍?拿出这道题真正想要传达的是解题的思路,以及不断优化探寻最优解的过程。希望通过这道题能给你带来一种解题优化的思路

二叉搜索树与双向链表

OJ链接

二叉树搜索树与双向链表

描述

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。如下图所示

数据范围:输入二叉树的节点数0 \le n \le 10000≤n≤1000,二叉树中每个节点的值0\le val \le 10000≤val≤1000

要求:空间复杂度O(1)O(1)(即在原树上操作),时间复杂度O(n)O(n)

注意:

1.要求不能创建任何新的结点,只能调整树中结点指针的指向。当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继

2.返回链表中的第一个节点的指针

3.函数返回的TreeNode,有左右指针,其实可以看成一个双向链表的数据结构

4.你不用输出双向链表,程序会根据你的返回值自动打印输出

知识点-二叉树递归

递归是一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。因此递归过程,最重要的就是查看能不能讲原本的问题分解为更小的子问题,这是使用递归的关键。

而二叉树的递归,则是将某个节点的左子树、右子树看成一颗完整的树,那么对于子树的访问或者操作就是对于原树的访问或者操作的子问题,因此可以自我调用函数不断进入子树。

知识点-二叉搜索树

二叉搜索树是一种特殊的二叉树,它的每个节点值大于它的左子节点,且大于全部左子树的节点值,小于它右子节点,且小于全部右子树的节点值。因此二叉搜索树一定程度上算是一种排序结构。

思路

二叉搜索树最左端的元素一定最小,最右端的元素一定最大,符合“左中右”的特性,因此二叉搜索树的中序遍历就是一个递增序列,我们只要对它中序遍历就可以组装称为递增双向链表。

具体做法

定义两个指针pCur和prev, pCur的当前节点的指针, prev是pCur的前驱节点的指针, 因此只要pre不为空, 连接方案就是prev.right = pCur, pCur.left = prev

二叉树中序遍历的顺序是左儿子->根节点->右儿子, 故我们只要按中序遍历的顺序移动prev和pCur指针, 就可以将整个二叉树连接为一条双向链表

代码

/**
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;
    public TreeNode(int val) {
        this.val = val;
    }
}
*/
public class Solution {
    public TreeNode Convert(TreeNode pRootOfTree) {
        if(pRootOfTree == null){
            return null;
        }  
        TreeNode head = pRootOfTree;      
        convertChild(pRootOfTree);
        while(head.left!=null){
            head = head.left;
        }
        return head;
    }
    TreeNode prev = null;
    //pCur为当前节点
    private void convertChild(TreeNode pCur){
        //递归出口
        if(pCur == null){
            return ;
        }
        //中序遍历,先找到最左边的节点,并与prev建立连接
        convertChild(pCur.left);
        pCur.left = prev;
        if(prev != null){
            prev.right = pCur;
        }
        //prev更新
        prev = pCur;
        convertChild(pCur.right);
    }
}

到此这篇关于Java实题演练二叉搜索树与双向链表分析的文章就介绍到这了,更多相关Java二叉搜索树与双向链表内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java中lambda表达式语法说明

    java中lambda表达式语法说明

    “Lambda 表达式”(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。Lambda表达式可以表示闭包(注意和数学传统意义上的不同)。
    2016-09-09
  • java String类功能、原理与应用案例【统计、判断、转换等】

    java String类功能、原理与应用案例【统计、判断、转换等】

    这篇文章主要介绍了java String类功能、原理与应用案例,结合实例形式详细分析了java String类的基本功能、构造方法,以及使用String类实现统计、判断、转换等功能相关操作技巧,需要的朋友可以参考下
    2019-03-03
  • Mac M1安装JDK的实战避坑指南

    Mac M1安装JDK的实战避坑指南

    这篇文章主要给大家介绍了关于Mac M1安装JDK避坑的相关资料,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2023-02-02
  • java打印表格 将ResultSet中的数据打印成表格问题

    java打印表格 将ResultSet中的数据打印成表格问题

    这篇文章主要介绍了java打印表格 将ResultSet中的数据打印成表格问题。具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • Spring Boot集成Ehcache缓存解决方式

    Spring Boot集成Ehcache缓存解决方式

    在本篇文章里小编给大家整理的是关于Spring Boot集成Ehcache缓存解决方式,需要的朋友们可以学习下。
    2019-12-12
  • 解读RedisTemplate的各种操作(set、hash、list、string)

    解读RedisTemplate的各种操作(set、hash、list、string)

    这篇文章主要介绍了解读RedisTemplate的各种操作(set、hash、list、string),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • vue+springboot读取git的markdown文件并展示功能

    vue+springboot读取git的markdown文件并展示功能

    Markdown-it 是一个用于解析和渲染 Markdown 标记语言的 JavaScript 库,使用 Markdown-it,你可以将 Markdown 文本解析为 HTML 输出,并且可以根据需要添加功能、扩展语法或修改解析行为,本文介绍vue+springboot读取git的markdown文件并展示,感兴趣的朋友一起看看吧
    2024-01-01
  • idea 隐藏target,iml等不需要展示的文件(推荐)

    idea 隐藏target,iml等不需要展示的文件(推荐)

    这篇文章主要介绍了idea 隐藏target,iml等不需要展示的文件,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • 深入理解Spring Aop的执行顺序

    深入理解Spring Aop的执行顺序

    本文将结合实例代码,介绍Spring Aop的执行顺序,非常具有实用价值,需要的朋友可以参考下
    2021-06-06
  • mybatis清除一级缓存的几种方式

    mybatis清除一级缓存的几种方式

    这篇文章主要介绍了mybatis清除一级缓存的几种方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03

最新评论