欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java源碼解析之平衡二叉樹

 更新時間:2021年05月20日 11:52:34   作者:不會編程的派大星  
在上一章的文章中,我們講到了二叉排序樹,它很好的平衡了插入與查找的效率,但二叉排序樹如果不平衡,那么查找效率就會大大降低,今天要講的這個平衡二叉樹就是一種解決這個問題的方法.需要的朋友可以參考下

一、平衡二叉樹的定義

平衡二叉樹是一種二叉排序樹,其中每一個節(jié)點的左子樹和右子樹的高度差至多等于1 。它是一種高度平衡的二叉排序樹。意思是說,要么它是一棵空樹,要么它的左子樹和右子樹都是平衡二叉樹,且左子樹和右子樹的深度之差的絕對值不超過1 。我們將二叉樹上結點的左子樹深度減去右子樹深度的值稱為平衡因子BF (Balance Factor),那么平衡二叉樹上所有結點的平衡因子只可能是-1 、0 和1。

這里舉個栗子:

在這里插入圖片描述

仔細看圖中值為18的節(jié)點,18的節(jié)點的深度為2 。而它的右子樹的深度為0,其差值的絕對值大于1了,所以這不是一科平衡二叉樹。

二、平衡二叉樹的實現(xiàn)原理

平衡二叉樹構建的基本思想就是在構建二叉排序樹的過程中,每當插入一個節(jié)點時,先檢查是否因插入而破壞了樹的平衡性,如果是,則找出最小不平衡二叉樹。在保持二叉排序樹特性的前提下,調(diào)整最小不平衡子樹中各節(jié)點之間的鏈接關系,進行相應的旋轉(zhuǎn),使之成為新的平衡子樹。最小不平衡子樹是指距離插入節(jié)點最近,且平衡因子的絕對值大于1的節(jié)點為根的子樹。

下面就讓我們通過一個栗子來看看平衡二叉樹是怎么構建的呢

首先我們將{3, 2, 1, 4, 5, 6, 7, 10, 9, 8}這樣的數(shù)組構建成一個二叉排序樹,按照二叉排序樹的性質(zhì),我們將得到下圖這樣的樹:

在這里插入圖片描述

從圖中可以看出,樹的高度達到了8,對于查找和插入效率肯定是不夠理想的。
接下里我們來看看怎么將這顆二叉排序樹一步步構建成平衡二叉樹的:

1.按數(shù)組順序?qū)?和3插入,此時沒有什么影響,3的平衡因子為1, 2的平衡因子為0,到這里還沒什么問題

在這里插入圖片描述

2.此時我們再來插入1,根據(jù)二叉排序樹,1只能是2的左子樹,然而此時3的平衡因子為2,已經(jīng)不符合平衡二叉樹的規(guī)則,這個時候,這棵樹就是最小不平衡子樹

在這里插入圖片描述

3.我們將其右旋:三個元素的平衡因子都為0,沒什么毛病,我們繼續(xù)

在這里插入圖片描述

4.在插入4,根據(jù)二叉排序樹的規(guī)則,4只能放在3的右子樹,此時沒什么大毛病,我們繼續(xù)

在這里插入圖片描述

5.在插入元素5,同理,5只能放在4的右子樹,此時元素2的平衡因子為2大于1,

在這里插入圖片描述

6.將其左旋:沒什么大毛病,我們繼續(xù)

在這里插入圖片描述

7.在插入元素6,此時為最小不平衡子樹

在這里插入圖片描述

8.再將其左旋,這里具體怎么左旋,就這么想,就是在滿足二叉排序樹性質(zhì)的同時,讓根節(jié)點左邊的深度增加,右子樹的深度減小,以達到滿足二叉平衡樹的性質(zhì)。

在這里插入圖片描述

接下來的過程大家可以自行去嘗試做出來

三、最終結果

在這里插入圖片描述

可以看到,最后樹的高度僅為4,比之前的8對比來說,效率就高了近一半。

平衡二叉樹的刪除操作與插入類似,這里將不再介紹。大家可以自己思考如何最高效地刪除元素,可以分葉結點、僅有一個子結點和有兩個子結點三種情況考慮,這里還用到了遞歸的思想。

到此這篇關于Java源碼解析之平衡二叉樹的文章就介紹到這了,更多相關Java平衡二叉樹內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • java 和 json 對象間轉(zhuǎn)換

    java 和 json 對象間轉(zhuǎn)換

    這篇文章主要介紹了java 和 json 對象間轉(zhuǎn)換,需要的朋友可以參考下
    2014-03-03
  • 在SpringBoot中,如何使用Netty實現(xiàn)遠程調(diào)用方法總結

    在SpringBoot中,如何使用Netty實現(xiàn)遠程調(diào)用方法總結

    我們在進行網(wǎng)絡連接的時候,建立套接字連接是一個非常消耗性能的事情,特別是在分布式的情況下,用線程池去保持多個客戶端連接,是一種非常消耗線程的行為.那么我們該通過什么技術去解決上述的問題呢,那么就不得不提一個網(wǎng)絡連接的利器——Netty,需要的朋友可以參考下
    2021-06-06
  • JAVA8獲取list集合中重復的元素與獲取去重數(shù)據(jù)實例

    JAVA8獲取list集合中重復的元素與獲取去重數(shù)據(jù)實例

    這篇文章主要給大家介紹了關于JAVA8獲取list集合中重復的元素與獲取去重數(shù)據(jù)的相關資料,在實際開發(fā)中經(jīng)常會遇到需要找出(刪除)一個list中某些元素的屬性相同的元素,需要的朋友可以參考下
    2023-07-07
  • SpringBoot讀取excel表格的示例代碼

    SpringBoot讀取excel表格的示例代碼

    這篇文章主要介紹了SpringBoot讀取excel表格的示例代碼,代碼簡單易懂,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • Java之如何獲取泛型參數(shù)

    Java之如何獲取泛型參數(shù)

    在Java開發(fā)中,獲取泛型參數(shù)一般有兩種方法:第一種是通過JDK自帶的API,主要利用反射機制來獲取類的泛型信息;第二種方法是借助Spring框架提供的GenericTypeResolver工具類,這種方式更加簡便,這兩種方法都能有效地幫助開發(fā)者在運行時獲取到泛型參數(shù)
    2024-09-09
  • java實現(xiàn)百度云OCR文字識別 高精度OCR識別身份證信息

    java實現(xiàn)百度云OCR文字識別 高精度OCR識別身份證信息

    這篇文章主要為大家詳細介紹了java實現(xiàn)百度云OCR文字識別,高精度OCR識別身份證信息,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-11-11
  • RESTful?API設計原則與實現(xiàn)示例詳解

    RESTful?API設計原則與實現(xiàn)示例詳解

    這篇文章主要為大家介紹了RESTful?API設計原則與實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • Java IO流操作(PipeInputStream、SequenceInputStream、BufferedInputStream)

    Java IO流操作(PipeInputStream、SequenceInputStream、Buffered

    管道流主要用于線程間通信,分為管道輸入流(PipeInputStream)和管道輸出流(PipeOutputStream),本文介紹了如何通過管道流進行數(shù)據(jù)發(fā)送和接收,具有一定的參考價值,感興趣的可以了解一下
    2024-10-10
  • java實現(xiàn)簡單的搜索引擎

    java實現(xiàn)簡單的搜索引擎

    這篇文章主要為大家詳細介紹了java實現(xiàn)簡單的搜索引擎的相關資料,需要的朋友可以參考下
    2016-02-02
  • idea 設置鼠標懸停(放上)彈出注釋的方法

    idea 設置鼠標懸停(放上)彈出注釋的方法

    這篇文章主要介紹了idea 設置鼠標懸停(放上)彈出注釋的方法,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11

最新評論