数据结构与算法--力扣108题将有序数组转换为二叉搜索树
生活随笔
收集整理的這篇文章主要介紹了
数据结构与算法--力扣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算法
總結
以上是生活随笔為你收集整理的数据结构与算法--力扣108题将有序数组转换为二叉搜索树的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据结构与算法一篇帮助你吃下KMP算法
- 下一篇: 数据结构与算法--力扣109题将有序双向