持續輸出面試題之算法--樹的查找

開篇介紹

你們好,我是Java最全面試題庫的提褲姐,今天這篇是數據結構與算法的第八篇,主要介紹查找中的樹的查找;在後續,會沿着第一篇開篇的知識線路一直總結下去,作到日更!若是我能作到百日百更,但願你也能夠跟着百日百刷,一百天養成一個好習慣。java

樹的查找

當用線性表做爲表的組織形式時,能夠有三種查找法,其中二分查找效率最高。但因爲二分查找要求表中結點按關鍵字有序,且不能用鏈表做存儲結構,所以,當表的插入或刪除操做頻繁時,爲維護表的有序性,勢必要移動表中不少結點,這種由移動結點引發的額外時間開銷,就會抵消二分查找的優勢。即二分查找只適用於靜態查找表。若要對動態查找表進行高效率的查找,則能夠採用幾種特殊的二叉樹或樹做爲表的組織形式。面試

二叉排序樹的查找

1.二叉排序樹
二叉排序樹( Binary Sort Tree稱二叉查找(搜索) Binary Search Tree,
定義:二叉排序樹或者是空樹,或者是知足以下性質的二叉樹:
①若它的左子樹非空,則左子樹上全部結點的值均小於根結點的值;
②若它的右子樹非空,則右子樹上全部結點的值均大於根結點的值;
③左、右子樹自己又各是一棵二叉排序樹。算法

上述性質簡稱二叉排序樹性質(BST性質),故二叉排序樹其實是知足BST性質的二叉樹。BST性質告訴咱們,二叉排序樹中任一結點x,其左(右)子樹中任一結點y(若存在)的關鍵字必小(大)於x的關鍵字。如此定義的二叉排序樹中各結點關鍵字是唯一的。但實際應用中,咱們不能保證被查找的數據集中各元素的關鍵字互不相同,因此可將二叉排序樹定義中BST性質(1)裏的「小於」改成「大於等於」,或將BST質(2)裏的「大於」改成「小於等於」,甚至可同時修改這兩個性質。
從BST性質可推出二叉排序樹的另外一個重要性質:按中序遍歷該樹所獲得的中序序列是一個遞增有序序列數據結構

代碼實現:spa

public class Search {
    public class BiTreeNode {
        int m_nValue;
        BiTreeNode m_pLeft;
        BiTreeNode m_pRight;
    }

    //二叉排序樹,二叉查找樹,二查搜索樹,是一顆具備以下特色的樹,樹的左邊都比它小,樹的右邊都比它大。
    public BiTreeNode BinaryBiSearch(BiTreeNode pHead,int b){
        if(pHead==null)
            return null;
        if(pHead.m_nValue==b)
            return pHead;
        if(pHead.m_pLeft!=null)
            return BinaryBiSearch(pHead.m_pLeft,b);
        if(pHead.m_pRight!=null)
            return BinaryBiSearch(pHead.m_pRight,b);
        return null;
    }
}

B樹:

在B-樹中查找給定關鍵字的方法是,首先把根結點取來,在根結點所包含的關鍵字K1,…,Kn查找給定的關鍵字(可用順序查找或二分查找法),若找到等於給定值的關鍵字,則查找成功;不然,必定能夠肯定要查找的關鍵字在Ki與Ki+1之間,Pi爲指向子樹根節點的指針,此時取指針Pi所指的結點繼續查找,直至找到,或指針Pi爲空時查找失敗。
image.png指針

以上圖爲例:若查詢的數值爲5:
第一次磁盤IO:在內存中定位(與1七、35比較),比17小,左子樹;
第二次磁盤IO:在內存中定位(與8、12比較),比8小,左子樹;
第三次磁盤IO:在內存中定位(與三、5比較),找到5,終止。
因爲B樹相對於二叉樹來講矮胖了許多,因此它所涉及的IO操做也相對少了許多。不過根據咱們上面的分析,其在查找數據的時候並無減小比較次數。可是咱們知道,咱們在比較數據的時候是在內存中進行的,因此相對來講時間上會更加迅速,幾乎能夠忽略。
插入流程:
image.pngcode

在下面的B樹中插入key:
第一步:檢索key插入的節點位置如上圖所示,在3,5之間
第二步:判斷節點中的關鍵碼個數節點3,5已是兩元素節點,沒法再增長(已經 = 3-1)。父親節點 2, 6 也是兩元素節點,也沒法再增長。根節點9是單元素節點,能夠升級爲兩元素節點。
第三步:結點分裂拆分節點3,5與節點2,6,讓根節點9升級爲兩元素節點4,9。節點6獨立爲根節點的第二個孩子。
image.pngblog

刪除流程:排序

第一步:判斷該元素是否在葉子結點上。該元素在葉子節點上,能夠直接刪去,可是刪除以後,中間節點12只有一個孩子,不符合B樹的定義:每一箇中間節點都包含k個孩子,(其中 ceil(m/2) <= k <= m)因此須要調整;
第二步:判斷其左右兄弟結點中有「多餘」的關鍵字,即:原關鍵字個數n>=ceil(m/2) - 1;顯然結點11的右兄弟節點中有多餘的關鍵字。那麼可將右兄弟結點中最小關鍵字上移至雙親結點。而將雙親結點中小於該上移關鍵字的關鍵字下移至被刪關鍵字所在結點中便可
image.png內存

image.png

相關文章
相關標籤/搜索