将升序单链表/数组转换为平衡二叉树BST

2023-11-18

给定一个单链表,其中的元素按升序排序,请将它转化成平衡二叉搜索树(BST)

 

递归:o(nlogn)

解题思路:

1.找到链表的中点mid,

2.记录mid前缀,断开链表

3.将mid放入到树中

4.递归head(左链表),mid.next(右链表)

import java.util.*;
/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 * }
 */
/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 * }
 */
public class Solution {
    /**
     *
     * @param head ListNode类
     * @return TreeNode类
     */
    //获取中间节点
    public ListNode getmid(ListNode head){
        ListNode slow=head;
        ListNode fast=head;
        ListNode pre_slow=null;//记录slow的前一个节点
        //快慢指针获取中点
        while(fast!=null&&fast.next!=null){
            pre_slow=slow;
            slow=slow.next;
            fast=fast.next.next;
        }
        if(pre_slow!=null)   pre_slow.next=null;//断开链表
        return slow;
    }
    public TreeNode sortedListToBST (ListNode head) {
        if(head==null){
            return null;
        }
        ListNode mid=this.getmid(head);
        //中间节点为树根节点
       TreeNode node=new TreeNode(mid.val);
       //如果只剩下一个节点,返回node
       if(head==mid){
           return node;
       }
       node.left=sortedListToBST(head);
       node.right=sortedListToBST(mid.next);
       return node;
    }
}

给出一个升序排序的数组,将其转化为平衡二叉搜索树(BST)

1.判空

2.递归左子树,右子树

import java.util.*;
/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 * }
 */
public class Solution {
    /**
     *
     * @param num int整型一维数组
     * @return TreeNode类
     */
    public TreeNode getBST(int[]num,int left,int right){
        if(num==null ||num.length<=0|| left>right){
            return null;
        }
//取中点
        int mid=left+(right-left+1)/2;
        //只有一个节点
        if(left==right){
            return new TreeNode(num[left]);
        }
        //根节点
        TreeNode root=new TreeNode(num[mid]) ;
        //递归左子树
        root.left=getBST(num,left,mid-1);
        //递归右子树
        root.right=getBST(num,mid+1,right);
        return root;
    }
    public TreeNode sortedArrayToBST (int[] num) {
        if(num==null ||num.length==0){
            return null;
        }
        return getBST(num,0,num.length-1);
    }
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将升序单链表/数组转换为平衡二叉树BST 的相关文章

  • 入职字节两个月,实在卷不动,还是离职了

    对自己收入不满意 就看下自己每天做了什么 把每天记录下来 看下自己的时间都用在哪里了 对自己的时间分配搞清楚了 就可以着手去改进 如果一直糊涂的过 时间到了报复就来了 时间管理很简单 不过大多数人是不会重视的 别总抱怨自己赚钱少 关键你做了
  • Asgard King(埃氏筛法)

    Description Thor had great power but his arrogant and reckless behavior set off an ancient war and he was demoted into t
  • Mock介绍

    mock的定义 what mock是在测试过程中 对于一些不容易构造 获取的对象 创建一个mock对象来模拟对象的行为 为什么要使用mock why 在做单元测试过程中 经常会有以下的场景 class A 依赖 class B class
  • 14.C++之对象的初始化和清理

    学习目标 学习内容 1 对象的初始化和清理 在C 中 每个对象也都会有初始设置以及 对象销毁前的清理数据的设置 今天介绍两种函数 构造函数和析构函数 来完成对象的初始化和清理 构造函数 主要用于为对象的成员属性赋值 又编译器自动完成 无须手
  • 报错:SyntaxError: (unicode error) ‘unicodeescape‘ codec can‘t decode bytes in position xx: truncated

    我给出的错误代码 错误原因 文件路径输入问题 解决方法 1 在前面加r 2 将 变为 3 将 变为
  • C++学习日志

    小白C 从入门到放弃 1 黑马通讯录管理系统 点运算符 和箭头运算符 gt 的区别 2 Essential C 中练习2 1 3 Essential C 中练习2 2 4 Essential C 中练习2 3 5 Essential C 中
  • C++中变量声明和定义

    1 声明和定义都规定了变量的名字和类型 但是定义会申请内存空间 也可能为变量赋一个初始值 2 同一个变量声明可以有多处 但定义只能有一处 extern int i 声明i而非定义i int j 声明并定义j extern关键字就是告诉编译器
  • 机器智能学科

    机器智能学科简介 机器智能 Machine Intelligence MI 是指由机器 计算机以及其它计算设备 实现的人的智能 也被称为人工智能 Artificial Intelligence AI 专指计算机科学中与智能行为自动化有关的一
  • RAC重建OCR/Voting disk总结

    author skatetime 2010 05 10 我的测试环境 母系统 win2003虚拟软件 vmware3 2 1guest系统 centos4 7oracle db oracle10 2 1 前两天由于意外原因 同事从新插拔下电
  • Auto-GPT横空出世!

    转自公众号 放码过来a 千万别关注 为怕你看了会上瘾 Auto GPT 顾名思义 其独到之处就在于 Auto 可 自主 实现你设定的任何目标 即 Auto GPT 会自己上网查资料 自己思考解决方案 自己运用相关工具 而你要做的 就是在屏幕
  • 报错Error : Program type already present: android.support.design.widget.CoordinatorLayout$

    方法一 support依赖版本改为27 1 1并添加一下配置 implementation com android support appcompat v7 27 1 1 configurations all exclude group c
  • 工具技能学习(一):前置技能-makfile、make、.mk

    工具技能学习 一 前置技能 makfile make mk 在构建镜像的时候你肯定看到了很多的makefile文件 昨天我们也解读一些一些构建编译的makefile文件 但是有些兄弟没有这方面的经验 对于makefile文件的格式还是不是很
  • 树莓派4B之Windows XP系统安装游戏(二)

    上一篇博文 树莓派4B之Windows XP系统安装游戏 一 上上篇博文 树莓派4B安装windows xp windows 95 windows xp windows 95 for raspberry pi 4B 目录 一 获取游戏下载途
  • re模块----你也可以玩得很溜正则表达式

    目录 re模块 compile pattern flags 0 flag匹配模式 match pattern string flags 0 search pattern string flags 0 findall pattern stri
  • java file类总结

    直入正题 代码 自己可以复制去看 里面主要 介绍了文件的File类的新建 删除 重命等操作 以及File文件的属性方法 package com gx iodemo import java awt BufferCapabilities Fli
  • APP漏洞挖掘(二)同开发商的多款APP存在通用漏洞

    0x01 前言 测某一APP时 根据信息收集 测试 发现APP的后台系统存在SQL注入 XSS 弱口令 信息泄漏等漏洞 此APP本身存在逻辑漏洞与SQL注入漏洞 再通过观察酷传搜索的结果发现此APP开发商开发了三十几个APP 猜测可能存在相
  • video-09-video音频视频 进度条无法正常使用问题

    开发过程中遇到了 进度条无法使用 吓我一跳 还以为是开发有问题呢 目录 一 现象 二 原因 三 解决 一 现象 网页播放器能够正常播放文件 但是播放器的进度条只能显示进度 没办法拖动 二 原因 视频url链接缺少响应头 三 解决 https
  • Allegro整体旋转

    1 激活MOVE命令 然后在Options栏Point选择User Pick 在Find栏勾上所有ALL ON 2 空白处 右击选中Temp Group 3 选中要旋转的部分 右击选中Complete 4 点击一点作为User Pick旋转
  • spi总线之通信原理及linux驱动读写实现

    一 SPI简介 1 SPI 全称SerialPerripheral Interface 也就是串行外围设备接口 是一种高速全双工穿的同步通信总线 SPI时钟频率相比I2C要高得多 最高可以达到上百MHz SPI以主从方式工作 通常是一个主设

随机推荐