国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【數(shù)據(jù)結(jié)構(gòu)】 二叉搜索樹的實(shí)現(xiàn)

這篇具有很好參考價(jià)值的文章主要介紹了【數(shù)據(jù)結(jié)構(gòu)】 二叉搜索樹的實(shí)現(xiàn)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

??二叉搜索樹的概念

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

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

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

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

比如以下就為一個(gè)人二叉搜索樹

int[] array ={5,3,4,1,7,8,2,6,0,9};
【數(shù)據(jù)結(jié)構(gòu)】 二叉搜索樹的實(shí)現(xiàn),數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),二叉樹,java,搜索樹

??二叉搜索樹功能實(shí)現(xiàn)

我們創(chuàng)建一個(gè)二叉樹如下所示,方便后續(xù)操作:

    class TreeNode {
        public int key ;
        public TreeNode left;
        public TreeNode right;
        public TreeNode(int key) {
            this.key = key;
        }
    }
    public TreeNode root;//根節(jié)點(diǎn)

??查找關(guān)鍵字key

若根節(jié)點(diǎn)不為空:

  • 如果根節(jié)點(diǎn)key==查找key,返回true
  • 如果根節(jié)點(diǎn)key > 查找key,在其左子樹查找
  • 如果根節(jié)點(diǎn)key < 查找key,在其右子樹查找

否則,返回false

【數(shù)據(jù)結(jié)構(gòu)】 二叉搜索樹的實(shí)現(xiàn),數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),二叉樹,java,搜索樹

??代碼實(shí)現(xiàn):

    public Boolean find(int key) {
        TreeNode cur = root;
        while (cur != null) {
            if (key == cur.key) {
                return true;
            } else if (key < cur.key) {
                cur = cur.left;
            } else {
                cur = cur.right;
            }
        }
        return false;
    }

??插入關(guān)鍵字key

插入操作可以分為以下兩種情況:

  1. 如果樹為空樹,即根 == null,直接插入【數(shù)據(jù)結(jié)構(gòu)】 二叉搜索樹的實(shí)現(xiàn),數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),二叉樹,java,搜索樹
  2. 如果樹不是空樹,按照查找邏輯確定插入位置,插入新結(jié)點(diǎn)
    【數(shù)據(jù)結(jié)構(gòu)】 二叉搜索樹的實(shí)現(xiàn),數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),二叉樹,java,搜索樹

??代碼實(shí)現(xiàn):

    public void insert(int key) {
        if(root == null) {
            root = new TreeNode(key);
            return;
        }
        TreeNode cur = root;
        TreeNode parent = null;
        while (cur != null) {
            if (key == cur.key) {
                return ;
            } else if (key < cur.key) {
                parent = cur;
                cur = cur.left;
            } else {
                parent = cur;
                cur = cur.right;
            }
        }
        TreeNode node = new TreeNode(key);
        if (key < parent.key) {
            parent.left = node;
        } else {
            parent.right = node;
        }
    }

??刪除關(guān)鍵字key

設(shè)待刪除結(jié)點(diǎn)為 cur, 待刪除結(jié)點(diǎn)的雙親結(jié)點(diǎn)為 parent,我們又可以分為四種情況

  1. cur.left == null
  • cur 是 root,則 root = cur.right
  • cur 不是 root,cur 是 parent.left,則 parent.left = cur.right
  • cur 不是 root,cur 是 parent.right,則 parent.right = cur.right

如下圖所示:
【數(shù)據(jù)結(jié)構(gòu)】 二叉搜索樹的實(shí)現(xiàn),數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),二叉樹,java,搜索樹

  1. 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

與·上述情況類似,不做過多贅述

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

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

我們使用target來遍歷尋找右子樹中關(guān)鍵碼最小的節(jié)點(diǎn),targetParent用來記錄target的父親節(jié)點(diǎn)

找到相應(yīng)節(jié)點(diǎn)后與待刪除的cur節(jié)點(diǎn)的值進(jìn)行替換

最后刪除target結(jié)點(diǎn)即可

  1. cur左右孩子均不存在

直接置為null就好

??代碼實(shí)現(xiàn):

   private void removeNode(TreeNode parent, TreeNode cur) {
        if(cur.left == null) {
            if(cur == root) {
                root = cur.right;
            }else if(parent.left == cur) {
                parent.left = cur.right;
            }else {
                parent.right = cur.right;
            }
        }else if(cur.right == null) {
            if(cur == root) {
                root = cur.left;
            }else if(parent.left == cur) {
                parent.left = cur.left;
            }else {
                parent.right = cur.left;
            }
        }else {
            TreeNode target = cur.right;
            TreeNode targetParent = cur;
            while (target.left != null) {
                targetParent = target;
                target = target.left;
            }
            cur.key = target.key;
            if(target == targetParent.left) {
                targetParent.left = target.right;
            }else {
                targetParent.right = target.right;
            }
        }
    }

??搜索二叉樹性能分析

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

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

但對(duì)于同一個(gè)關(guān)鍵碼集合,如果各關(guān)鍵碼插入的次序不同,可能得到不同結(jié)構(gòu)的二叉搜索樹:
【數(shù)據(jù)結(jié)構(gòu)】 二叉搜索樹的實(shí)現(xiàn),數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),二叉樹,java,搜索樹
最優(yōu)情況下,二叉搜索樹為完全二叉樹,其平均比較次數(shù)為:
【數(shù)據(jù)結(jié)構(gòu)】 二叉搜索樹的實(shí)現(xiàn),數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),二叉樹,java,搜索樹

最差情況下,二叉搜索樹退化為單支樹,其平均比較次數(shù)為:
【數(shù)據(jù)結(jié)構(gòu)】 二叉搜索樹的實(shí)現(xiàn),數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),二叉樹,java,搜索樹

?總結(jié)

關(guān)于《【數(shù)據(jù)結(jié)構(gòu)】 二叉搜索樹的實(shí)現(xiàn)》就講解到這兒,感謝大家的支持,歡迎各位留言交流以及批評(píng)指正,如果文章對(duì)您有幫助或者覺得作者寫的還不錯(cuò)可以點(diǎn)一下關(guān)注,點(diǎn)贊,收藏支持一下!文章來源地址http://www.zghlxwxcb.cn/news/detail-709333.html

到了這里,關(guān)于【數(shù)據(jù)結(jié)構(gòu)】 二叉搜索樹的實(shí)現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【數(shù)據(jù)結(jié)構(gòu)】二叉樹的實(shí)現(xiàn)

    【數(shù)據(jù)結(jié)構(gòu)】二叉樹的實(shí)現(xiàn)

    一棵二叉樹是結(jié)點(diǎn)的一個(gè)有限集合,該集合分為兩點(diǎn): 一是為空和二是由一個(gè)根節(jié)點(diǎn)加上兩棵別稱為左子樹和右子樹的二叉樹組成從圖上看出有2個(gè)性質(zhì): 二叉樹不存在度大于2的結(jié)點(diǎn) 二叉樹的子樹有左右之分,次序不能顛倒,因此二叉樹是有序樹 對(duì)于任意的二叉樹都是由以下

    2024年02月02日
    瀏覽(19)
  • 【數(shù)據(jù)結(jié)構(gòu)】二叉樹的順序結(jié)構(gòu)及實(shí)現(xiàn)

    【數(shù)據(jù)結(jié)構(gòu)】二叉樹的順序結(jié)構(gòu)及實(shí)現(xiàn)

    目錄 1. 二叉樹的順序結(jié)構(gòu) 2. 堆的概念及結(jié)構(gòu) 3. 堆的實(shí)現(xiàn) 3.1 堆向下調(diào)整算法 3.2 堆的創(chuàng)建 3.3 建堆時(shí)間復(fù)雜度 3.4 堆的插入 3.5 堆的刪除 3.6 堆的代碼實(shí)現(xiàn) 4. 堆的應(yīng)用 4.1 堆排序 4.2 TOP-K問題 普通的二叉樹是不適合用數(shù)組來存儲(chǔ)的,因?yàn)榭赡軙?huì)存在大量的空間浪費(fèi)。而完全二叉

    2024年02月08日
    瀏覽(23)
  • 數(shù)據(jù)結(jié)構(gòu):二叉樹的鏈?zhǔn)浇Y(jié)構(gòu)的實(shí)現(xiàn)

    ? 目錄 ?1.通過前序遍歷構(gòu)建二叉樹 2.?二叉樹的銷毀 ?3.二叉樹的遍歷 4.?二叉樹的節(jié)點(diǎn)個(gè)位和二叉樹的葉子節(jié)點(diǎn)個(gè)位數(shù) 5.?二叉樹的的k層節(jié)點(diǎn)數(shù)和查找值為x的節(jié)點(diǎn) 6.?判斷二叉樹是否為完全二叉樹和求二叉樹的高度h 二叉樹的前序遍歷 二叉樹的中序遍歷 二叉樹的后序遍歷

    2024年02月12日
    瀏覽(30)
  • 【數(shù)據(jù)結(jié)構(gòu)】二叉樹的鏈?zhǔn)浇Y(jié)構(gòu)及實(shí)現(xiàn)

    【數(shù)據(jù)結(jié)構(gòu)】二叉樹的鏈?zhǔn)浇Y(jié)構(gòu)及實(shí)現(xiàn)

    目錄 1. 前置說明 2. 二叉樹的遍歷 2.1 前序、中序以及后序遍歷 2.2 層序遍歷 3.?節(jié)點(diǎn)個(gè)數(shù)及高度等 4. 二叉樹的創(chuàng)建和銷毀 在學(xué)習(xí)二叉樹的基本操作前,需先要?jiǎng)?chuàng)建一棵二叉樹,然后才能學(xué)習(xí)其相關(guān)的基本操作。由于現(xiàn)在大家對(duì)二叉樹結(jié)構(gòu)掌握還不夠深入,為了降低大家學(xué)習(xí)成

    2024年02月08日
    瀏覽(25)
  • 【數(shù)據(jù)結(jié)構(gòu)】二叉樹的模擬實(shí)現(xiàn)

    【數(shù)據(jù)結(jié)構(gòu)】二叉樹的模擬實(shí)現(xiàn)

    前言:前面我們學(xué)習(xí)了堆的模擬實(shí)現(xiàn),今天我們來進(jìn)一步學(xué)習(xí)二叉樹,當(dāng)然了內(nèi)容肯定是越來越難的,各位我們一起努力! ?? 博主CSDN主頁:衛(wèi)衛(wèi)衛(wèi)的個(gè)人主頁 ?? ?? 專欄分類:數(shù)據(jù)結(jié)構(gòu) ?? ??代碼倉(cāng)庫(kù):衛(wèi)衛(wèi)周大胖的學(xué)習(xí)日記?? ??關(guān)注博主和博主一起學(xué)習(xí)!一起努力! 樹是一

    2024年02月03日
    瀏覽(20)
  • 【數(shù)據(jù)結(jié)構(gòu)】二叉樹的鏈?zhǔn)浇Y(jié)構(gòu)的實(shí)現(xiàn) -- 詳解

    【數(shù)據(jù)結(jié)構(gòu)】二叉樹的鏈?zhǔn)浇Y(jié)構(gòu)的實(shí)現(xiàn) -- 詳解

    在學(xué)習(xí)二叉樹的基本操作前,需先要?jiǎng)?chuàng)建一棵二叉樹,然后才能學(xué)習(xí)其相關(guān)的基本操作。為了降低大家學(xué)習(xí)成本,此處手動(dòng)快速創(chuàng)建一棵簡(jiǎn)單的二叉樹,快速進(jìn)入二叉樹操作學(xué)習(xí)。 注意 :上述代碼并不是創(chuàng)建二叉樹的方式。 學(xué)習(xí)二叉樹結(jié)構(gòu),最簡(jiǎn)單的方式就是遍歷。所謂

    2024年02月12日
    瀏覽(29)
  • 數(shù)據(jù)結(jié)構(gòu)之二叉樹的實(shí)現(xiàn)

    數(shù)據(jù)結(jié)構(gòu)之二叉樹的實(shí)現(xiàn)

    目錄 前言 1. 二叉樹的遍歷 1.1二叉樹的前、中、后序遍歷 1.2?層序遍歷 2.二叉樹的實(shí)現(xiàn) 2.1 二叉樹的結(jié)構(gòu) 2.2構(gòu)建二叉樹 ?2.2 前序遍歷的實(shí)現(xiàn) 2.3 中序遍歷的實(shí)現(xiàn) 2.4 后序遍歷的實(shí)現(xiàn) 2.5 計(jì)算樹的節(jié)點(diǎn)個(gè)數(shù) 2.6 計(jì)算樹的深度 2.7 計(jì)算葉子節(jié)點(diǎn)個(gè)數(shù) 2.8 計(jì)算樹第k層的節(jié)點(diǎn)數(shù) 2.9 以內(nèi)容

    2023年04月10日
    瀏覽(23)
  • 數(shù)據(jù)結(jié)構(gòu)-二叉樹的代碼實(shí)現(xiàn)(詳解)

    數(shù)據(jù)結(jié)構(gòu)-二叉樹的代碼實(shí)現(xiàn)(詳解)

    內(nèi)容:二叉樹的前、中,后序遍歷,層序遍歷,二叉樹節(jié)點(diǎn)個(gè)數(shù),葉子節(jié)點(diǎn)個(gè)數(shù),二叉樹高度,第k層節(jié)點(diǎn)的個(gè)數(shù),查找某個(gè)節(jié)點(diǎn),二叉樹銷毀,判斷是否為完全二叉樹 目錄 ?前序遍歷: 中序遍歷: 后序遍歷: 層次遍歷:需要借助隊(duì)列 ?二叉樹節(jié)點(diǎn)個(gè)數(shù): ?二叉樹葉子節(jié)點(diǎn)

    2024年02月03日
    瀏覽(20)
  • 【數(shù)據(jù)結(jié)構(gòu)】二叉樹---紅黑樹的實(shí)現(xiàn)

    【數(shù)據(jù)結(jié)構(gòu)】二叉樹---紅黑樹的實(shí)現(xiàn)

    目錄 一.? 紅黑樹的概念及性質(zhì) 二.? 紅黑樹結(jié)點(diǎn)結(jié)構(gòu)的定義 三.? 紅黑樹的插入操作 ? ? ?1. 情況一 ? ? ?2. 情況二 ? ? ? ?3. 情況三 四.? 紅黑樹的驗(yàn)證 五.??紅黑樹與AVL樹的比較 紅黑樹是一種自平衡的二叉搜索樹,它在每個(gè)節(jié)點(diǎn)上增加了一個(gè)存儲(chǔ)位來表示節(jié)點(diǎn)的顏色,

    2024年03月21日
    瀏覽(19)
  • 數(shù)據(jù)結(jié)構(gòu):二叉樹的遞歸實(shí)現(xiàn)(C實(shí)現(xiàn))

    數(shù)據(jù)結(jié)構(gòu):二叉樹的遞歸實(shí)現(xiàn)(C實(shí)現(xiàn))

    個(gè)人主頁 : 個(gè)人主頁 個(gè)人專欄 : 《數(shù)據(jù)結(jié)構(gòu)》 《C語言》 本篇博客主要講解二叉樹的相關(guān)操作如下: 樹是一種非線性結(jié)構(gòu),它是由n個(gè)有限節(jié)點(diǎn)組成的一個(gè)有層次關(guān)系的集合。 圖中 A節(jié)點(diǎn) 沒有前驅(qū)節(jié)點(diǎn),被稱為根節(jié)點(diǎn) 除根節(jié)點(diǎn)外,其余節(jié)點(diǎn)被分成兩個(gè)無不相交的集合T1(

    2024年02月12日
    瀏覽(18)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包