数据结构与算法--力扣108题将有序数组转换为二叉搜索树

力扣108提将有序数组转换为二叉搜索树
  • 近一年都比较关注算法相关的知识,也刷了不少题,之前的文章中大多也是算法相关的文章,但是感觉每次遇到树相关的题型都不能应对自如,因此还是有必要在相关知识上下功夫,因此有此次总结,以下是所有树相关的文章

数据结构与算法–面试必问AVL树原理及实现

数据结构与算法–二叉树的深度问题

数据结构与算法–二叉堆(最大堆,最小堆)实现及原理

数据结构与算法–二叉查找树转顺序排列双向链表

数据结构与算法-- 二叉树中和为某一值的路径

数据结构与算法-- 二叉树后续遍历序列校验

数据结构与算法-- 广度优先打印二叉树

数据结构与算法–解决问题的方法- 二叉树的的镜像

数据结构与算法–重建二叉树

数据结构与算法–二叉查找树实现原理

数据结构与算法–二叉树实现原理

数据结构与算法–B树原理及实现

数据结构与算法–数字在排序数组中出现次数

数据结构与算法–死磕二叉树

数据结构与算法–二叉树第k个大的节点

数据结构与算法–力扣108提将有序数组转换为二叉搜索树

原题:
  • 给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。
  • 如下图所示:
    在这里插入图片描述
解析
  • 如上题意,高度平衡二叉查找树,并且高度差不超过1,这正好符合AVL树的定义
  • AVL(Adelson-Velskii 和landis)树是带有平衡条件的二叉查找树,这个平衡条件必须容易实现,并且保证树的深度必须是O(logN)。因此我们让一棵AVL树中每个节点的左子树和右子树的高度最多相差1(空树高度定义-1)如下图,左边是AVL树,右边不是AVL树。

在这里插入图片描述

  • 对AVl树的构建实现以及原理在之前的文章 数据结构与算法–面试必问AVL树原理及实现 有做详细的分析

  • 算法分析如下:

    • 关键点一 升序 排列 的数组
    • 关键点二,AVL树(左子树小于根,右子树大于根,高度差小于1)
    • 根据如上两个关键信息,要得到一颗AVL树,我们需要根的左右子树节点一样,或者相差1
    • 根据AVL树的特性,左小右大,那么我们选取数组第中间大的数据作为根节点
    • 因为是升序排序,那么0~length/2 就是左子树,length/2 +1 ~ length就是右子树
    • 同样的道理,对应左子树中也可以同样看成是一颗AVL树,对于右子树同样看成hi一颗AVL树,得出一个递归的构建过程
算法实现
/**
 * 有序数组转换为高度平衡二叉搜索树(AVL树)
 * @author liaojiamin
 * @Date:Created in 16:34 2022/2/21
 */
public class SortArrayToAvlTree {
    public static void main(String[] args) {
        int[] arr = new int[20];
        Random random = new Random();
        for (int i = 0; i < 20; i++) {
            if(i == 0){
                arr[i] = random.nextInt(30);
            }else {
                arr[i] = random.nextInt(30) + arr[i-1];
            }
            System.out.print(arr[i] + ",");
        }
        System.out.println();
        BinaryNode avlTree = sortArrayToAVL(arr);
        printTreeMiddle(avlTree);
    }
    
    /**
     * 中序遍历
     * */
    public static void printTreeMiddle(BinaryNode binaryNode){
        if(binaryNode == null){
            return;
        }
        printTreeMiddle(binaryNode.getLeft());
        System.out.println(binaryNode.getElement());
        printTreeMiddle(binaryNode.getRight());
    }


    /**
     * 有序数组递归构建AVL树
     * */
    public static BinaryNode sortArrayToAVL(int[] arr){
        if(arr == null || arr.length == 0){
            return null;
        }
        if(arr.length == 1){
            return new BinaryNode(arr[0], null, null);
        }
        BinaryNode leftNode = sortArrayToAVL(Arrays.copyOfRange(arr, 0, (arr.length/2)));
        BinaryNode rightNode = sortArrayToAVL(Arrays.copyOfRange(arr, (arr.length/2)+1,arr.length));
        BinaryNode rootNode = new BinaryNode(arr[arr.length/2], leftNode, rightNode);
        return rootNode;
    }
}

上一篇:数据结构与算法一篇帮助你吃下KMP算法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值