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

java基礎(chǔ)二叉搜索樹圖文詳解

 更新時間:2022年03月10日 12:53:42   作者:Dark?And?Grey  
二叉樹是一種非常重要的數(shù)據(jù)結(jié)構(gòu),它同時具有數(shù)組和鏈表各自的特點,下面這篇文章主要給大家介紹了關(guān)于java基礎(chǔ)二叉搜索樹的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下

概念

二叉搜索樹又稱二叉排序樹,它或者是一棵空樹,或者是具有以下性質(zhì)的二叉樹:
1、若它的左子樹不為空,則左子樹上所有節(jié)點的值都小于根結(jié)點的值。
2、若它的右子樹不為空,則右子樹上所有節(jié)點的值都大于根結(jié)點的值。
3、它的左右子樹也分別為二叉搜索樹

直接實踐

準(zhǔn)備工作:定義一個樹節(jié)點的類,和二叉搜索樹的類。

搜索二叉樹的查找功能

假設(shè)我們已經(jīng)構(gòu)造好了一個這樣的二叉樹,如下圖

我們要思考的第一個問題是如何查找某個值是否在該二叉樹中?

根據(jù)上述的邏輯,我們來把搜索的方法進行完善。

搜索二叉樹的插入操作

根據(jù)上述邏輯,我們來寫一個插入節(jié)點的代碼。

搜索二叉樹 刪除節(jié)點的操作 - 難點

再來分析一下:curDummy 和 parentDummy 是怎么找到“替罪羊”的。

總程序 - 模擬實現(xiàn)二叉搜索樹

class TreeNode{
    public int val;
    public TreeNode left;
    public TreeNode right;
    public TreeNode(int val){
        this.val = val;
    }
}


public class BinarySearchTree {
    TreeNode root;

    //在二叉樹中 尋找指定 val 值的節(jié)點
    // 找到了,返回其節(jié)點地址;沒找到返回 null
    public TreeNode search(int key){
        TreeNode cur = this.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){
        if(this.root == null){
            this.root = new TreeNode(key);
            return true;
        }
        TreeNode cur = this.root;
        TreeNode parent = null;
        while(cur!=null){
            if(key > cur.val){
                parent  = cur;
                cur = cur.right;
            }else if(cur.val == key){
                return false;
            }else{
                parent  = cur;
                cur = cur.left;
            }
        }
        TreeNode node = new TreeNode(key);
        if(parent .val > key){
            parent.left = node;
        }else{
            parent.right = node;
        }
        return true;
    }
    // 刪除操作
    public void remove(int key){
        TreeNode cur = root;
        TreeNode parent = null;
        // 尋找 刪除節(jié)點位置。
        while(cur!=null){
            if(cur.val == key){
                removeNode(cur,parent);// 真正刪除節(jié)點的代碼
                break;
            }else if(cur.val < key){
                parent = cur;
                cur = cur.right;
            }else{
                parent = cur;
                cur = cur.left;
            }
        }
    }
    // 輔助刪除方法:真正刪除節(jié)點的代碼
    private void removeNode(TreeNode cur,TreeNode parent){
        // 情況一
        if(cur.left == null){
            if(cur == this.root){
                this.root = this.root.right;
            }else if( cur == parent.left){
                parent.left = cur.right;
            }else{
                parent.right = cur.right;
            }
            // 情況二
        }else if(cur.right == null){
            if(cur == this.root){
                this.root = root.left;
            }else if(cur == parent.left){
                parent.left = cur.left;
            }else{
                parent.right = cur.left;
            }
            // 情況三
        }else{
            // 第二種方法:在刪除節(jié)點的右子樹中尋找最小值,
            TreeNode parentDummy = cur;
            TreeNode curDummy = cur.right;
            while(curDummy.left != null){
                parentDummy = curDummy;
                curDummy = curDummy.left;
            }
            // 此時 curDummy 指向的 cur 右子樹
            cur.val = curDummy.val;
            if(parentDummy.left != curDummy){
                parentDummy.right = curDummy.right;
            }else{
                parentDummy.left = curDummy.right;
            }

        }
    }
   // 中序遍歷
    public void inorder(TreeNode root){
        if(root == null){
            return;
        }
        inorder(root.left);
        System.out.print(root.val+" ");
        inorder(root.right);
    }

    public static void main(String[] args) {
        int[] array = {10,8,19,3,9,4,7};
        BinarySearchTree binarySearchTree = new BinarySearchTree();
        for (int i = 0; i < array.length; i++) {
            binarySearchTree.insert(array[i]);
        }
        binarySearchTree.inorder(binarySearchTree.root);
        System.out.println();// 換行
        System.out.print("插入重復(fù)的數(shù)據(jù) 9:" + binarySearchTree.insert(9));
        System.out.println();// 換行
        System.out.print("插入不重復(fù)的數(shù)據(jù) 1:" + binarySearchTree.insert(1));
        System.out.println();// 換行
        binarySearchTree.inorder(binarySearchTree.root);
        System.out.println();// 換行
        binarySearchTree.remove(19);
        System.out.print("刪除元素 19 :");
        binarySearchTree.inorder(binarySearchTree.root);
        System.out.println();// 換行
        System.out.print("查找不存在的數(shù)據(jù)50 :");
        System.out.println(binarySearchTree.search(50));
        System.out.print("查找存在的數(shù)據(jù) 7:");
        System.out.println(binarySearchTree.search(7));
    }
}

性能分析

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

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

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

如果我們能保證 二叉搜索樹的左右子樹高度差不超過1。盡量滿足高度平衡條件。
這就成 AVL 樹了(高度平衡的二叉搜索樹)。而AVL樹,也有缺點:需要一個頻繁的旋轉(zhuǎn)。浪費很多效率。
至此 紅黑樹就誕生了,避免更多的旋轉(zhuǎn)。

和 java 類集的關(guān)系

TreeMap 和 TreeSet 即 java 中利用搜索樹實現(xiàn)的 Map 和 Set;實際上用的是紅黑樹,而紅黑樹是一棵近似平衡的二叉搜索樹,即在二叉搜索樹的基礎(chǔ)之上 + 顏色以及紅黑樹性質(zhì)驗證,關(guān)于紅黑樹的內(nèi)容,等博主學(xué)了,會寫博客的。

總結(jié) 

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

相關(guān)文章

  • jdbc實現(xiàn)寵物商店管理系統(tǒng)

    jdbc實現(xiàn)寵物商店管理系統(tǒng)

    這篇文章主要為大家詳細介紹了jdbc實現(xiàn)寵物商店管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-10-10
  • 深入理解java泛型Generic

    深入理解java泛型Generic

    這篇文章主要介紹了深入理解java泛型Generic,文中有非常詳細的代碼示例,對正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-05-05
  • 解決日期轉(zhuǎn)化Json異常- Date JSON parse error

    解決日期轉(zhuǎn)化Json異常- Date JSON parse error

    這篇文章主要介紹了解決日期轉(zhuǎn)化Json異常- Date JSON parse error問題。具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • java使用SFTP上傳文件到資源服務(wù)器

    java使用SFTP上傳文件到資源服務(wù)器

    這篇文章主要介紹了java使用SFTP上傳文件到資源服務(wù)器,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • idea兩側(cè)的maven-project-structure圖標(biāo)不見了如何解決

    idea兩側(cè)的maven-project-structure圖標(biāo)不見了如何解決

    這篇文章主要介紹了如何解決idea兩側(cè)的maven-project-structure圖標(biāo)不見了問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Java使用ByteBuffer進行多文件合并和拆分的代碼實現(xiàn)

    Java使用ByteBuffer進行多文件合并和拆分的代碼實現(xiàn)

    因為驗證證書的需要,需要把證書文件和公鑰給到客戶,考慮到多個文件交互的不便性,所以決定將2個文件合并成一個文件交互給客戶,但是由于是加密文件,采用字符串形式合并后,拆分后文件不可用,本文給大家介紹了Java使用ByteBuffer進行多文件合并和拆分,需要的朋友可以參考下
    2024-09-09
  • java之路徑分隔符介紹

    java之路徑分隔符介紹

    考慮到程序的可移植性,創(chuàng)建文件時建議大家選用"/",因為經(jīng)過測試用java創(chuàng)建文件時在windows平臺下用“/”也是可以的,java貌似在后臺作過處理了。
    2013-03-03
  • MybatisPlus使用@TableId主鍵id自增長無效的解決

    MybatisPlus使用@TableId主鍵id自增長無效的解決

    本文主要介紹了MybatisPlus使用@TableId主鍵id自增長無效的解決,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • 使用Mybatis-plus清空表數(shù)據(jù)的操作方法

    使用Mybatis-plus清空表數(shù)據(jù)的操作方法

    MyBatis 是一個基于 java 的持久層框架,它內(nèi)部封裝了 jdbc,極大提高了我們的開發(fā)效率,文中給大家介紹了MybatisPlus常用API-增刪改查功能,感興趣的朋友跟隨小編一起看看吧
    2022-11-11
  • Java中方法的使用、重載與遞歸的詳細介紹

    Java中方法的使用、重載與遞歸的詳細介紹

    前面我們提到了方法需要參數(shù)類型,但是如果我們需要用一個函數(shù)同時兼容多種參數(shù)的情況應(yīng)該怎么辦呢? 這里就可以使用到方法重載,對Java中方法的使用、重載與遞歸相關(guān)知識感興趣的朋友一起看看吧
    2021-11-11

最新評論

金阳县| 偏关县| 潼南县| 巧家县| 宁津县| 汉阴县| 兰西县| 青州市| 岗巴县| 特克斯县| 攀枝花市| 古交市| 黄石市| 徐闻县| 湖北省| 平阴县| 如皋市| 公安县| 襄城县| 五常市| 宁乡县| 辰溪县| 奉新县| 凤城市| 克拉玛依市| 延津县| 高淳县| 弥渡县| 临武县| 岢岚县| 武冈市| 运城市| 札达县| 西丰县| 深水埗区| 武宣县| 裕民县| 政和县| 临潭县| 武穴市| 镇宁|