最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java源碼解析之平衡二叉樹

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

一、平衡二叉樹的定義

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

這里舉個(gè)栗子:

在這里插入圖片描述

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

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

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

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

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

在這里插入圖片描述

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

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

在這里插入圖片描述

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

在這里插入圖片描述

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

在這里插入圖片描述

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

在這里插入圖片描述

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

在這里插入圖片描述

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

在這里插入圖片描述

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

在這里插入圖片描述

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

在這里插入圖片描述

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

三、最終結(jié)果

在這里插入圖片描述

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

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

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

相關(guān)文章

  • JAVA獲取當(dāng)前項(xiàng)目和文件所在路徑的實(shí)例代碼

    JAVA獲取當(dāng)前項(xiàng)目和文件所在路徑的實(shí)例代碼

    這篇文章主要介紹了JAVA獲取當(dāng)前項(xiàng)目和文件所在路徑的實(shí)例代碼,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • 使用Spring的StopWatch實(shí)現(xiàn)代碼性能監(jiān)控的方法詳解

    使用Spring的StopWatch實(shí)現(xiàn)代碼性能監(jiān)控的方法詳解

    在開發(fā)過程中,偶爾還是需要分析代碼的執(zhí)行時(shí)間,Spring 框架提供了一個(gè)方便的工具類 StopWatch,本文將介紹 StopWatch 的基本用法,并通過示例演示如何在項(xiàng)目中使用 StopWatch 進(jìn)行代碼性能監(jiān)控
    2023-12-12
  • Java SpringMVC實(shí)現(xiàn)國際化整合案例分析(i18n)

    Java SpringMVC實(shí)現(xiàn)國際化整合案例分析(i18n)

    本篇文章主要介紹了Java SpringMVC實(shí)現(xiàn)國際化整合案例分析(i18n),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • servlet配置方法及其生命周期詳解

    servlet配置方法及其生命周期詳解

    下面小編就為大家?guī)硪黄猻ervlet配置方法及其生命周期詳解。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-08-08
  • 使用springboot結(jié)合vue實(shí)現(xiàn)sso單點(diǎn)登錄

    使用springboot結(jié)合vue實(shí)現(xiàn)sso單點(diǎn)登錄

    這篇文章主要為大家詳細(xì)介紹了如何使用springboot+vue實(shí)現(xiàn)sso單點(diǎn)登錄,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • java實(shí)現(xiàn)滑動(dòng)驗(yàn)證解鎖

    java實(shí)現(xiàn)滑動(dòng)驗(yàn)證解鎖

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)滑動(dòng)驗(yàn)證解鎖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • java中Unsafe的使用講解

    java中Unsafe的使用講解

    這篇文章主要介紹了java中Unsafe的使用講解,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Java?Jar包項(xiàng)目內(nèi)存設(shè)置方法舉例

    Java?Jar包項(xiàng)目內(nèi)存設(shè)置方法舉例

    這篇文章主要給大家介紹了關(guān)于Java?Jar包項(xiàng)目內(nèi)存設(shè)置方法的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2024-01-01
  • Java如何獲得泛型類中的泛型類型T.class

    Java如何獲得泛型類中的泛型類型T.class

    獲取泛型符號E的Class對象的方法,1.反射方案利用匿名子類實(shí)例化,但該方法有特殊限制,2.反射方案2直接指定泛型類型,但不靈活,3.構(gòu)造方法方案在初始化時(shí)傳入泛型類,但有寫錯(cuò)風(fēng)險(xiǎn)
    2024-12-12
  • Spring配置數(shù)據(jù)源的三種方式(小結(jié))

    Spring配置數(shù)據(jù)源的三種方式(小結(jié))

    本文主要介紹了Spring配置數(shù)據(jù)源的三種方式,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01

最新評論

那曲县| 余干县| 尼勒克县| 即墨市| 双柏县| 长宁县| 贵德县| 沿河| 兰州市| 苏尼特左旗| 贵港市| 蒙自县| 长顺县| 毕节市| 乌拉特中旗| 额济纳旗| 新田县| 逊克县| 叙永县| 乾安县| 江口县| 丰宁| 安泽县| 镇赉县| 炎陵县| 峨边| 永宁县| 乐平市| 岳阳县| 淄博市| 密山市| 平谷区| 通渭县| 黄骅市| 霸州市| 固原市| 衡南县| 沈丘县| 曲沃县| 岑溪市| 平塘县|