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

Java深入了解數(shù)據(jù)結(jié)構(gòu)之二叉搜索樹增 插 刪 創(chuàng)詳解

 更新時間:2022年01月27日 15:13:24   作者:/少司命  
二叉搜索樹是以一棵二叉樹來組織的。每個節(jié)點(diǎn)是一個對象,包含的屬性有l(wèi)eft,right,p和key,其中,left指向該節(jié)點(diǎn)的左孩子,right指向該節(jié)點(diǎn)的右孩子,p指向該節(jié)點(diǎn)的父節(jié)點(diǎn),key是它的值

①概念

二叉搜索樹又稱二叉排序樹,它或者是一棵空樹**,或者是具有以下性質(zhì)的二叉樹:

若它的左子樹不為空,則左子樹上所有節(jié)點(diǎn)的值都小于根節(jié)點(diǎn)的值

若它的右子樹不為空,則右子樹上所有節(jié)點(diǎn)的值都大于根節(jié)點(diǎn)的值

它的左右子樹也分別為二叉搜索樹

②操作-查找

二叉搜索樹的查找類似于二分法查找

public Node search(int key) {
        Node cur = root;
        while (cur != null) {
            if(cur.val == key) {
                return cur;
            }else if(cur.val < key) {
                cur = cur.right;
            }else {
                cur = cur.left;
            }
        }
        return null;
    }

③操作-插入

  public boolean insert(int key) {
        Node node = new Node(key);
        if(root == null) {
            root = node;
            return true;
        }
 
        Node cur = root;
        Node parent = null;
 
        while(cur != null) {
            if(cur.val == key) {
                return false;
            }else if(cur.val < key) {
                parent = cur;
                cur = cur.right;
            }else {
                parent = cur;
                cur = cur.left;
            }
        }
        //parent
        if(parent.val > key) {
            parent.left = node;
        }else {
            parent.right = node;
        }
 
        return true;
    }

④操作-刪除

刪除操作較為復(fù)雜,但理解了其原理還是比較容易

設(shè)待刪除結(jié)點(diǎn)為 cur, 待刪除結(jié)點(diǎn)的雙親結(jié)點(diǎn)為 parent

1. cur.left == null

1. cur 是 root,則 root = cur.right

2. cur 不是 root,cur 是 parent.left,則 parent.left = cur.right

3. cur 不是 root,cur 是 parent.right,則 parent.right = cur.right

2. cur.right == null

1. cur 是 root,則 root = cur.left

2. cur 不是 root,cur 是 parent.left,則 parent.left = cur.left

3. cur 不是 root,cur 是 parent.right,則 parent.right = cur.left

第二種情況和第一種情況相同,只是方向相反,這里不再畫圖

3. cur.left != null && cur.right != null

需要使用替換法進(jìn)行刪除,即在它的右子樹中尋找中序下的第一個結(jié)點(diǎn)(關(guān)鍵碼最小),用它的值填補(bǔ)到被刪除節(jié)點(diǎn)中,再來處理該結(jié)點(diǎn)的刪除問題

當(dāng)我們在左右子樹都不為空的情況下進(jìn)行刪除,刪除該節(jié)點(diǎn)會破壞樹的結(jié)構(gòu),因此用替罪羊的方法來解決,實(shí)際刪除的過程還是上面的兩種情況,這里還是用到了搜索二叉樹的性質(zhì)

public void remove(Node parent,Node cur) {
        if(cur.left == null) {
            if(cur == root) {
                root = cur.right;
            }else if(cur == parent.left) {
                parent.left = cur.right;
            }else {
                parent.right = cur.right;
            }
        }else if(cur.right == null) {
            if(cur == root) {
                root = cur.left;
            }else if(cur == parent.left) {
                parent.left = cur.left;
            }else {
                parent.right = cur.left;
            }
        }else {
            Node targetParent =  cur;
            Node target = cur.right;
            while (target.left != null) {
                targetParent = target;
                target = target.left;
            }
            cur.val = target.val;
            if(target == targetParent.left) {
                targetParent.left = target.right;
            }else {
                targetParent.right = target.right;
            }
        }
    }
 
  public void removeKey(int key) {
        if(root == null) {
            return;
        }
        Node cur = root;
        Node parent = null;
        while (cur != null) {
            if(cur.val == key) {
                remove(parent,cur);
                return;
            }else if(cur.val < key){
                parent = cur;
                cur = cur.right;
            }else {
                parent = cur;
                cur = cur.left;
            }
        }
    }

⑤性能分析

插入和刪除操作都必須先查找,查找效率代表了二叉搜索樹中各個操作的性能。

對有n個結(jié)點(diǎn)的二叉搜索樹,若每個元素查找的概率相等,則二叉搜索樹平均查找長度是結(jié)點(diǎn)在二叉搜索樹的深度 的函數(shù),即結(jié)點(diǎn)越深,則比較次數(shù)越多。

但對于同一個關(guān)鍵碼集合,如果各關(guān)鍵碼插入的次序不同,可能得到不同結(jié)構(gòu)的二叉搜索樹:

最優(yōu)情況下,二叉搜索樹為完全二叉樹,其平均比較次數(shù)為:

最差情況下,二叉搜索樹退化為單支樹,其平均比較次數(shù)為:

⑥完整代碼

public class TextDemo {
 
    public static class Node {
        public int val;
        public Node left;
        public Node right;
 
        public Node (int val) {
            this.val = val;
        }
    }
 
 
    public Node root;
 
    /**
     * 查找
     * @param key
     */
    public Node search(int key) {
        Node cur = root;
        while (cur != null) {
            if(cur.val == key) {
                return cur;
            }else if(cur.val < key) {
                cur = cur.right;
            }else {
                cur = cur.left;
            }
        }
        return null;
    }
 
    /**
     *
     * @param key
     * @return
     */
    public boolean insert(int key) {
        Node node = new Node(key);
        if(root == null) {
            root = node;
            return true;
        }
 
        Node cur = root;
        Node parent = null;
 
        while(cur != null) {
            if(cur.val == key) {
                return false;
            }else if(cur.val < key) {
                parent = cur;
                cur = cur.right;
            }else {
                parent = cur;
                cur = cur.left;
            }
        }
        //parent
        if(parent.val > key) {
            parent.left = node;
        }else {
            parent.right = node;
        }
 
        return true;
    }
 
    public void remove(Node parent,Node cur) {
        if(cur.left == null) {
            if(cur == root) {
                root = cur.right;
            }else if(cur == parent.left) {
                parent.left = cur.right;
            }else {
                parent.right = cur.right;
            }
        }else if(cur.right == null) {
            if(cur == root) {
                root = cur.left;
            }else if(cur == parent.left) {
                parent.left = cur.left;
            }else {
                parent.right = cur.left;
            }
        }else {
            Node targetParent =  cur;
            Node target = cur.right;
            while (target.left != null) {
                targetParent = target;
                target = target.left;
            }
            cur.val = target.val;
            if(target == targetParent.left) {
                targetParent.left = target.right;
            }else {
                targetParent.right = target.right;
            }
        }
    }
 
    public void removeKey(int key) {
        if(root == null) {
            return;
        }
        Node cur = root;
        Node parent = null;
        while (cur != null) {
            if(cur.val == key) {
                remove(parent,cur);
                return;
            }else if(cur.val < key){
                parent = cur;
                cur = cur.right;
            }else {
                parent = cur;
                cur = cur.left;
            }
        }
    }
 
}

到此這篇關(guān)于Java深入了解數(shù)據(jù)結(jié)構(gòu)之二叉搜索樹增 插 刪 創(chuàng)詳解的文章就介紹到這了,更多相關(guān)Java 二叉搜索樹內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot之如何指定配置文件啟動

    SpringBoot之如何指定配置文件啟動

    這篇文章主要介紹了SpringBoot之如何指定配置文件啟動問題,具有很好的參考價值,希望對大家有所幫助。
    2023-04-04
  • SpringBoot調(diào)用第三方WebService接口的兩種方法

    SpringBoot調(diào)用第三方WebService接口的兩種方法

    本文主要介紹了SpringBoot調(diào)用第三方WebService接口的兩種方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • Java基礎(chǔ)之MapReduce框架總結(jié)與擴(kuò)展知識點(diǎn)

    Java基礎(chǔ)之MapReduce框架總結(jié)與擴(kuò)展知識點(diǎn)

    本章,是MapReduce的最終章,我在寫本章的時候,發(fā)現(xiàn)前面忘記介紹MpaTask與ReduceTask了,所以本章補(bǔ)上哈,另外還有兩個擴(kuò)展的知識點(diǎn),講完這些,我會對整個MapReduce進(jìn)行總結(jié)一下,讓大家再次了解MapReduce的工作流程,更加清晰地認(rèn)識MapReduce ,需要的朋友可以參考下
    2021-05-05
  • springboot配置druid多數(shù)據(jù)源的示例代碼

    springboot配置druid多數(shù)據(jù)源的示例代碼

    這篇文章主要介紹了springboot配置druid多數(shù)據(jù)源的示例代碼,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-09-09
  • JAVA提高第九篇 集合體系

    JAVA提高第九篇 集合體系

    這篇文章主要為大家詳細(xì)介紹了JAVA提高第九篇集合體系的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • 基于redis key占用內(nèi)存量分析

    基于redis key占用內(nèi)存量分析

    這篇文章主要介紹了基于redis key占用內(nèi)存量分析,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • MyBatis-Plus詳解(環(huán)境搭建、關(guān)聯(lián)操作)

    MyBatis-Plus詳解(環(huán)境搭建、關(guān)聯(lián)操作)

    MyBatis-Plus 是一個 MyBatis 的增強(qiáng)工具,在 MyBatis 的基礎(chǔ)上只做增強(qiáng)不做改變,為簡化開發(fā)、提高效率而生,今天通過本文給大家介紹MyBatis-Plus環(huán)境搭建及關(guān)聯(lián)操作,需要的朋友參考下吧
    2022-09-09
  • Java編碼輔助工具M(jìn)apstruct用法詳解

    Java編碼輔助工具M(jìn)apstruct用法詳解

    這篇文章主要介紹了Java編碼輔助工具M(jìn)apstruct用法詳解,手動編碼setter/getter各個對應(yīng)屬性,會顯得臃腫繁瑣。通過Mapstruct框架可簡單方便地完成這一工作。,需要的朋友可以參考下
    2019-06-06
  • spring?boot+mybatis-plus配置讀寫分離的操作

    spring?boot+mybatis-plus配置讀寫分離的操作

    這篇文章主要介紹了spring?boot+mybatis-plus配置讀寫分離的操作,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2024-01-01
  • SpringBoot使用Apache Tika實(shí)現(xiàn)多種文檔的內(nèi)容解析

    SpringBoot使用Apache Tika實(shí)現(xiàn)多種文檔的內(nèi)容解析

    在日常開發(fā)中,我們經(jīng)常需要解析不同類型的文檔,如PDF、Word、Excel、HTML、TXT等,Apache Tika是一個強(qiáng)大的內(nèi)容解析工具,可以輕松地提取文檔中的內(nèi)容和元數(shù)據(jù)信息,本文將通過SpringBoot和Apache Tika的結(jié)合,介紹如何實(shí)現(xiàn)對多種文檔格式的內(nèi)容解析
    2024-12-12

最新評論

隆化县| 齐河县| 顺平县| 望江县| 平果县| 子洲县| 宜宾县| 新蔡县| 五大连池市| 三原县| 建德市| 建阳市| 新津县| 日喀则市| 勐海县| 长葛市| 广宗县| 剑河县| 蒙阴县| 洛扎县| 古田县| 汉中市| 岱山县| 湄潭县| 五常市| 西充县| 抚松县| 兴安县| 塔城市| 灯塔市| 浏阳市| 福清市| 冕宁县| 和硕县| 鄂尔多斯市| 博白县| 波密县| 康乐县| 黄骅市| 和林格尔县| 理塘县|