微信搜一搜bigsai
大家都在关注的刷题、学习数据结构和算法宝藏项目
关注回复进群即可加入力扣打卡群,欢迎划水。

将有序数组转换成平衡二叉树

将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。

本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。

示例:

给定有序数组: [-10,-3,0,5,9],

一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树:

      0/ \-3   9/   /-10  5

分析
对于二叉平衡树来说,我们知道它的中序序列是一个升序序列,刚好和我们的给定的升序数组是一致的。而数组反向构造一个二叉平衡树,如果从左向右一个个构造、旋转那样的话代价太大了,所以这道题我们根据数组的特征去构造一棵二叉平衡树。

二叉平衡树的左右高度之差小于等于1,那么我们每次按照这个策略构造即可完成一个二叉平衡树:每次选取待构造的中间节点当成根节点,然后递归的将左右两个区域按照同样方法构造。

具体实现的代码为:

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode(int x) { val = x; }* }*/
class Solution {public TreeNode sortedArrayToBST(int[] nums) {return sortedArrayToBST(nums,0,nums.length-1);}private TreeNode sortedArrayToBST(int[] nums, int start,int end) {if(nums.length==0||start>end)return null;int mid=(start+end)/2;TreeNode node=new TreeNode(nums[mid]);node.left=sortedArrayToBST(nums, start, mid-1);node.right=sortedArrayToBST(nums, mid+1, end);return node;}
}

将有序链表转换为二叉平衡树

给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。

本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。

示例:

给定的有序链表: [-10, -3, 0, 5, 9],一个可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面这个高度平衡二叉搜索树:0/ \-3   9/   /-10  5

分析:
这道题的核心思路和有序数组的转换成平衡二叉树差不多,但是链表的弱点就是查询效率,当然你可以先枚举一遍链表然后转换成数组转换成二叉平衡树的问题,和上一题的思路相同,但是这里的话就是用一个快慢指针进行查找。

当然,每次找到中间节点的时候同样需要将链表分成两部分,这样我事先将慢指针设置一个前驱节点在操作的时候更容易拆分成两个部分。

具体的代码为:

 /*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public TreeNode sortedListToBST(ListNode head) {if(head==null)return  null;if(head.next==null)return  new TreeNode(head.val);ListNode fast=head;ListNode slow=new ListNode(0);slow.next=head;while(fast!=null&&fast.next!=null){fast=fast.next.next;slow=slow.next;}TreeNode node=new TreeNode(slow.next.val);node.right=sortedListToBST(slow.next.next);slow.next=null;node.left=sortedListToBST(head);return  node;}
}

原创不易,bigsai请你帮两件事帮忙一下:

  1. star支持一下, 您的肯定是我在平台创作的源源动力。

  2. 微信搜索「bigsai」,关注我的公众号,不仅免费送你电子书,我还会第一时间在公众号分享知识技术。加我还可拉你进力扣打卡群一起打卡LeetCode。

记得关注、咱们下次再见!

经典面试题:将有序数组、有序链表转换成平衡二叉树相关推荐

  1. 【LeetCode-面试算法经典-Java实现】【109-Convert Sorted List to Binary Search Tree(排序链表转换成二叉排序树)】...

    [109-Convert Sorted List to Binary Search Tree(排序链表转换成二叉排序树)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 ...

  2. 去除有序数组/链表的重复元素--双指针原地修改

    去除有序数组的重复元素–双指针原地修改 文章目录 去除有序数组的重复元素--双指针原地修改 一.题目描述 二.分析 三.代码:数组 四.代码:链表 一.题目描述 二.分析 显然,由于数组已经排序,所以 ...

  3. 合并K个有序数组(链表)【字节跳动面试算法题】

    本题是本人字节跳动一面考的算法题原题是有序数组,一时没想到怎么解决数组的问题,但是如果给的是有序链表数组,则可以用下面的方法解决 可以利用最小堆完成,时间复杂度是O(nklogk),具体过程如下: 创 ...

  4. 数组--将两个有序数组a,b合并成新的有序数组c

    有两个有序的数组a,b;长度分别是m,n;请使用时间复杂度为m+n的算法,将此两个数组重新合并构成一个有序数组c. 1 static void Main(string[] args) 2 { 3 in ...

  5. javascript常见面试题之一:将字符串'get-element-by-id'转换成驼峰命名法;

    var str='get-element-by-id'; function strToupper(str) { //利用split将字符串分割成数组var arr= str.split('-');fo ...

  6. php把对象转换成数组,php对象转换成数组的方法

    php对象转换成数组的方法 发布时间:2020-05-20 14:13:07 来源:亿速云 阅读:108 作者:鸽子 php对象转数组方法 在php中将对象转数组的方法,可以通过使用"get ...

  7. 一道经典面试题讲解 :数组越界而没报错 ,却出现死循环 ?(C语言)

    下面这道经典易错题出自<C陷阱与缺陷>,也一度被众多互联网公司作为面试题拿来考察,可见其易错程度与重点程度,下面我就给大家详细讲解一下这道列题,希望对大家有所帮助: 作为面试题: 下面我们 ...

  8. Java经典面试题详解:Java字符串转成list

    阿里巴巴Java岗面试题分享 1.HashMap 的内部结构?内部原理?和 HashTable 的区别,假如发⽣了 hash 碰撞,如何设计能让遍历效率⾼? 2.讲一讲讲讲 ConcurrentHas ...

  9. isset php 二维数组_php 一维数组按条件转换成二维数组

    如:array(4){[0]=>array(4){["id"]=>string(1)"2"["sort"]=>string ...

最新文章

  1. 阿里云服务器ECS配置LNMP
  2. keep 虚拟路线修改器_螺丝刀【第1期】:如何使用Keep塑造理想身材
  3. mysql启动错误1067进程意外终止的解决方法
  4. 达梦数据库的基本使用
  5. 大棚骨架搭建好 科学施肥增收增产
  6. 2048——Java控制台版本
  7. 第六章 计算机性能测试
  8. 手机这5个反人类的设计,你能容忍到第几个?
  9. java可选项_在Java中链接可选项8
  10. 【C++自我精讲】基础系列三 重载
  11. Py之pandas:dataframe学习【转载】
  12. 浅谈c#变量的命名规则
  13. python的字典合并有相同的_将列表中的重复项合并到python字典中
  14. 微弱信号检测matlab代码,微弱信号检测方法研究
  15. win10增加图片查看器
  16. 阿里云创建AccessKey
  17. Itext生成pdf文件,itext+Freemarker生成pdf,(中文空白解决)
  18. maven lastUpdated 文件清理脚本
  19. 基于学术研究于NASA官网GPM卫星数据下载详细教程
  20. 2022年全国大学生数学建模竞赛E题目-小批量物料生产安排详解+思路+Python代码时序预测模型(三)

热门文章

  1. python 语言教程(4)元组
  2. buu [BJDCTF 2nd]rsa1
  3. 10-Platform Interrupt Controller API
  4. 免费Opengrok-代码阅读工具:Kernel,Optee,ATF,Uboot...
  5. 【攻防世界002】EasyRE
  6. (46)分析 INT 0x2E 和 sysenter
  7. 21、 TRUNCATE:清空表记录
  8. 3.1 基础-抛小球
  9. 2021算法竞赛入门班第七节课【图论】练习题
  10. SQL语言之序列(Oracle)