專利名稱:基于樹形數(shù)據(jù)結(jié)構(gòu)節(jié)點的插入的方法和存儲裝置的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及存儲技術(shù)領(lǐng)域,特別涉及基于樹形數(shù)據(jù)結(jié)構(gòu)節(jié)點的插入的方 法和存儲裝置。
背景技術(shù):
樹形數(shù)據(jù)結(jié)構(gòu)中的樹由自然數(shù)個節(jié)點(Node )基于一定的關(guān)系結(jié)合構(gòu)成。 在任意一棵非空的樹中每個節(jié)點都具有用于唯一識別節(jié)點的關(guān)鍵碼值。在二 叉樹中上述關(guān)鍵碼值一般會用鍵(Key)來表示。
二叉樹是構(gòu)成樹的每個節(jié)點最多只能有兩個子節(jié)點的一種樹形數(shù)據(jù)結(jié) 構(gòu);在二叉樹中任取一個節(jié)點作為父節(jié)點,為了區(qū)分當(dāng)前節(jié)點的兩個子節(jié)點, 兩個子節(jié)點可以分別稱為父節(jié)點的左子節(jié)點和右子節(jié)點,在二叉樹中所有的 節(jié)點與其子節(jié)點基于的關(guān)系可以是左子節(jié)點大于父節(jié)點,父節(jié)點大于右子節(jié)點。
在二叉樹中插入節(jié)點的方法可以是將待插節(jié)點的關(guān)鍵碼值與二叉樹的 根節(jié)點的關(guān)鍵碼值比較,若待插節(jié)點的關(guān)鍵碼值小于根節(jié)點的關(guān)鍵碼值,則
進(jìn)入左子樹,否則進(jìn)入右子樹。在左子樹或右子樹里再將待插節(jié)點的關(guān)鍵:碼
值與子樹的根節(jié)點的關(guān)鍵碼值比較,如此進(jìn)行下去,直到把待插入點插入到 二叉樹里作為一個新的葉子節(jié)點。如果上述二叉樹的形狀是固定的(有時也 稱為樹的高度固定),上述4巴待插入點插入到二叉樹里作為一個新的葉子節(jié)點
可以理解為將待插節(jié)點插入到了一個虛擬的位置,然后對已經(jīng)存在的節(jié)點 和上述待插節(jié)點按照左子節(jié)點大于父節(jié)點,父節(jié)點大于右子節(jié)點的關(guān)系進(jìn)行 搬移。
發(fā)明人在實現(xiàn)本發(fā)明的過程中發(fā)現(xiàn)在形狀固定的樹里,插入新的節(jié)點 需要對已經(jīng)存在的節(jié)點進(jìn)行搬移,需要搬移的節(jié)點的數(shù)量會隨著樹的高度成 指數(shù)增長,從而導(dǎo)致節(jié)點的插入時間迅速增加;現(xiàn)有樹形數(shù)據(jù)結(jié)構(gòu)中節(jié)點插 入的速度慢。
發(fā)明內(nèi)容
本發(fā)明實施例要解決的技術(shù)問題是提供基于樹形數(shù)據(jù)結(jié)構(gòu)節(jié)點的插入的方法和存儲裝置,提高節(jié)點插入的速度。
為解決上述技術(shù)問題,本發(fā)明所提供的基于樹形數(shù)據(jù)結(jié)構(gòu)節(jié)點的插入方
法實施例可以通過以下技術(shù)方案實現(xiàn)
根據(jù)待插節(jié)點的關(guān)鍵碼值在主樹中查找最近主樹節(jié)點,所述最近主樹節(jié) 點的關(guān)鍵碼值小于且最接近待插節(jié)點的關(guān)鍵碼值;所述主樹的根節(jié)點初始化 為具有最小的關(guān)鍵碼值;其中,所述主樹包括父節(jié)點、所述父節(jié)點的左子節(jié) 點和所述父節(jié)點的右子節(jié)點,且所述左子節(jié)點大于所述父節(jié)點,所述父節(jié)點 大于所述右子節(jié)點;
以最近主樹節(jié)點的外部指針指向的從樹作為當(dāng)前從樹,判斷當(dāng)前從樹是 否已滿,
若是,則在當(dāng)前從樹中任意選擇一個節(jié)點作為拆分節(jié)點,將拆分節(jié)點插 入到主樹中作為新建主樹節(jié)點,為新建主樹節(jié)點分配新建從樹,并將新建主 樹節(jié)點的外部指針指向新建從樹,將當(dāng)前從樹中位于拆分節(jié)點左側(cè)的全部節(jié) 點搬移到新建從樹中,然后執(zhí)行查找最近主樹節(jié)點,
若否,則將待插節(jié)點插入到當(dāng)前從樹中。
本發(fā)明實施例還提供了另 一種基于樹形數(shù)據(jù)結(jié)構(gòu)節(jié)點的插入方法,包括 根據(jù)待插節(jié)點的關(guān)鍵碼值在主樹中查找最近主樹節(jié)點,所述最近主樹節(jié)
點的關(guān)鍵碼值大于且最接近待插節(jié)點的關(guān)鍵碼值;所述主樹的根節(jié)點初始化 為具有最大的關(guān)鍵碼值;所述主樹中的左子節(jié)點大于父節(jié)點,父節(jié)點大于右 子節(jié)點;
以最近主樹節(jié)點的外部指針指向的從樹作為當(dāng)前從樹,判斷當(dāng)前從樹是 否已滿,
若是,則在當(dāng)前從樹中任意選擇一個節(jié)點作為拆分節(jié)點,將拆分節(jié)點插 入到主樹中作為新建主樹節(jié)點,為新建主樹節(jié)點分配新建從樹,并將新建主 樹節(jié)點的外部指針指向新建從樹,將當(dāng)前從樹中位于拆分節(jié)點右側(cè)的全部節(jié) 點搬移到新建從樹中,然后執(zhí)行查找最近主樹節(jié)點;
若否,則將待插節(jié)點插入到當(dāng)前從樹中。
本發(fā)明實施例還提供了 一種存儲裝置,包括
從樹存儲單元,用于存儲從樹;主樹存儲單元,用于存儲主樹,主樹中的節(jié)點具有指向從樹的外部指針。
本發(fā)明實施例還提供了一種通信設(shè)備,包括上述存儲裝置。 上述技術(shù)方案具有如下有益效果將樹形數(shù)據(jù)結(jié)構(gòu)的樹分成主樹和從樹
降低了樹的高度,減少了節(jié)點插入的時間,提高了節(jié)點的插入速度。
圖l為本發(fā)明實施例中樹形數(shù)據(jù)結(jié)構(gòu)示意圖; 圖2為現(xiàn)有技術(shù)中的多叉樹示意圖; 圖3為本發(fā)明實施例一節(jié)點插入的方法流程示意圖; 圖4為本發(fā)明實施例 一查找最近主樹節(jié)點的方法流程示意圖; 圖5為本發(fā)明實施例二節(jié)點查找的方法流程示意圖; 圖6為本發(fā)明實施例二查找最近主樹節(jié)點的方法流程示意圖; 圖7為本發(fā)明實施例三刪節(jié)點的方法流程示意圖; 圖8為本發(fā)明實施例四節(jié)點插入的方法流程示意圖; 圖9為本發(fā)明實施例四查找最近主樹節(jié)點的方法流程示意圖; 圖IO為本發(fā)明實施例五存儲裝置結(jié)構(gòu)示意圖; 圖11為本發(fā)明實施例六插入裝置的裝置結(jié)構(gòu)示意圖; 圖12為本發(fā)明實施例六的插入裝置加入平衡單元后的結(jié)構(gòu)示意圖; 圖13為本發(fā)明實施例七查找裝置結(jié)構(gòu)示意圖; 圖14為本發(fā)明實施例八刪除裝置結(jié)構(gòu)示意圖; 圖15為本發(fā)明實施例九合并裝置結(jié)構(gòu)示意圖; 圖16為本發(fā)明實施例十插入裝置結(jié)構(gòu)示意圖; 圖17為本發(fā)明實施例十二應(yīng)用環(huán)境的結(jié)構(gòu)示意圖; 圖18為本發(fā)明實施例十二現(xiàn)場可編程門陣列和存4諸器的結(jié)構(gòu)示意圖; 圖19為本發(fā)明實施例十二查找數(shù)據(jù)的方法流程示意圖; 圖20為本發(fā)明實施例十二更新數(shù)據(jù)的方法流程示意圖; 圖21為本發(fā)明實施例十二另 一更新數(shù)據(jù)的方法流程示意圖。
具體實施例方式
本發(fā)明實施例要解決的技術(shù)問題是提供一種基于樹形數(shù)據(jù)結(jié)構(gòu)節(jié)點的插 入的方法和存儲裝置,提高節(jié)點的插入的速度。在對本發(fā)明實施例進(jìn)行前對本發(fā)明實施例中,樹形數(shù)據(jù)結(jié)構(gòu)所使用的名 稱進(jìn)行一個說明,以二叉樹為例,如圖l所示,其中,圓可以表示為節(jié)點,圓中的數(shù)字可以表示為節(jié)點的關(guān)鍵碼值;可以看到深度為BranchO、 Branch 1、 Branch 2的三層節(jié)點基于一定的關(guān)系(用實線示意)結(jié)合構(gòu)成一棵樹,稱為主 樹;深度為Branch3、 Branch 4的兩層節(jié)點基于一定的關(guān)系(用虛線示意)結(jié) 合構(gòu)成了7棵樹,每顆樹都可以稱為從樹;主樹中的節(jié)點具有指向與本節(jié)點對 應(yīng)的從樹的外部指針(用帶箭頭的線表示)??梢岳斫獾氖?,上述主樹的高度、 從樹的高度、主樹中每個節(jié)點外部指針的數(shù)量、從樹的數(shù)量都是可以根據(jù)需 要存儲的數(shù)據(jù)規(guī)模等條件來設(shè)定,圖l不應(yīng)理解為對本發(fā)明實施例的限定。另 外,在后續(xù)實施例的說明中無特別說明,稱節(jié)點大或小均指關(guān)鍵碼值大或?。?在本發(fā)明實施例中,主樹和從樹的高度設(shè)定后,數(shù)據(jù)的插入刪除等操作不改 變主樹和從樹能夠具有的最大高度;本發(fā)明實施例中的樹形數(shù)據(jù)結(jié)構(gòu)是有序樹形數(shù)據(jù)結(jié)構(gòu),為方便說明在本 發(fā)明實施例中將左定義為大的一側(cè),右定義為小的一側(cè),可以理解的是左和 右是一個相對的概念,左和右僅表示大小關(guān)系不應(yīng)理解為對本發(fā)明實施例的 限定,可以從主樹中看到根據(jù)這樣的大小關(guān)系建立的樹形結(jié)構(gòu)中,任選一個 節(jié)點其左側(cè)的節(jié)點都大于該節(jié)點,右側(cè)的節(jié)點都小于該節(jié)點;另外對樹形數(shù)據(jù)結(jié)構(gòu)中的一些概念進(jìn)行簡單的介紹,如圖l所示,以主樹為例節(jié)點16在主樹中沒有上層節(jié)點,節(jié)點30在從樹中沒有上層節(jié)點,可以稱 節(jié)點16為主樹的根節(jié)點,節(jié)點30為節(jié)點30所在從樹的根節(jié)點;與節(jié)點24有直接聯(lián)系的上層節(jié)點(節(jié)點16)為節(jié)點24的父節(jié)點,節(jié)點24 則為節(jié)點16的子節(jié)點,可以看到節(jié)點8也是節(jié)點16的子節(jié)點,為了區(qū)分節(jié)點24 和節(jié)點8,可以稱節(jié)點24為節(jié)點16的左子節(jié)點,節(jié)點8為節(jié)點16的右子節(jié)點; 另外,具有父子關(guān)系的節(jié)點在邏輯上是相鄰的,稱為相鄰節(jié)點;可以看到左子節(jié)點、右子節(jié)點還可以有自己的子節(jié)點,所有的子節(jié)點 可以稱為節(jié)點16的子孫;節(jié)點16的左子節(jié)點(節(jié)點24)和節(jié)點24的子孫,也 是樹形的結(jié)構(gòu),可以稱為節(jié)點16的左子樹,同理右子節(jié)點(節(jié)點8)和節(jié)點8 的子孫,可以稱為節(jié)點16的右子樹;節(jié)點28、節(jié)點20等節(jié)點在主樹中沒有子節(jié)點,可以稱為主樹的葉子節(jié)點。 如圖2所示,為一4果多叉樹,可以看到深度為BranchO、 Branch l的兩層節(jié) 點基于一定的關(guān)系(用實線示意)構(gòu)成多叉樹,與二叉樹類似,不同點在于 多叉樹中每個節(jié)點可以有多個子節(jié)點;在多叉樹中取一個節(jié)點(節(jié)點16)作 為當(dāng)前節(jié)點,參考二叉樹,可以將當(dāng)前節(jié)點的子節(jié)點分為左子節(jié)點(虛線的 左邊)和右子節(jié)點(虛線右邊);與二叉樹不同的是這時左子節(jié)點和右子節(jié) 點都可以有多個,當(dāng)前節(jié)點與其子節(jié)點的關(guān)系依然可以參考二叉樹左子節(jié) 點大于當(dāng)前節(jié)點,當(dāng)前節(jié)點大于右子節(jié)點;另外,在多個左子節(jié)點和多個右 子節(jié)點也可以按照一定的順序進(jìn)行排序,圖2中從左到右排序依據(jù)從大到小的 原則進(jìn)行(圖2中左子節(jié)點排序依次為節(jié)點32、節(jié)點31、節(jié)點29、節(jié)點27,右 子節(jié)點排序依次為節(jié)點23、節(jié)點21、節(jié)點19、節(jié)點8),當(dāng)然也可以從小到大 排序。可以理解的是在多叉樹節(jié)點的插入、查找、刪除都是可以參考二叉樹 進(jìn)行的,在本發(fā)明實施例的說明中均以二叉樹為例,可以理解的是,二叉樹 不應(yīng)理解為對本發(fā)明實施例的限定,本發(fā)明實施例中所述的樹也可以是多叉 樹。實施例一,如圖3所示,本發(fā)明實施例提供了一種基于樹形數(shù)據(jù)結(jié)構(gòu)節(jié)點 的插入方法,包括以下步驟步驟301:根據(jù)待插節(jié)點的關(guān)4t碼值在主樹中查找最近主樹節(jié)點,上述最 近主樹節(jié)點的關(guān)鍵碼值小于且最接近于待插節(jié)點的關(guān)鍵碼值;上述主樹的根 節(jié)點初始化為具有最小的關(guān)鍵碼值;其中,上述主樹包括父節(jié)點、上述父節(jié) 點的左子節(jié)點和上述父節(jié)點的右子節(jié)點,且上述左子節(jié)點大于上述父節(jié)點, 上述父節(jié)點大于上述右子節(jié)點在一棵樹中,插入的節(jié)點的關(guān)鍵碼值會在一個數(shù)域內(nèi)取值,上述最小關(guān) 鍵碼值可以是上述數(shù)域中最小的數(shù),也可以是小于上述數(shù)域中的所有數(shù)的任 意值;上述查找最近主樹節(jié)點的方法是在主樹中查找關(guān)鍵碼值小于且最接近 于待插節(jié)點的關(guān)鍵碼值的節(jié)點;后續(xù)實施例中將給出一種查找最近主樹節(jié)點 的實現(xiàn)方式;步驟302:以最近主樹節(jié)點的外部指針指向的從樹作為當(dāng)前從樹;步驟303:判斷當(dāng)前從樹是否已滿,若是,則進(jìn)入步驟304,若否則進(jìn)入 步驟305;上述當(dāng)前從樹是否已滿,可以是上述當(dāng)前從樹的使用率是否達(dá)到設(shè)定 的使用率,若是,則確定上述當(dāng)前從樹已滿,若否,則確定上述當(dāng)前從樹未 滿;也可以是上述當(dāng)前從樹是否已經(jīng)沒有空節(jié)點了,若是,則確定當(dāng)前從 樹已滿,若否,則確定當(dāng)前從樹未滿。步驟304:在當(dāng)前從樹中任意選擇一個節(jié)點作為拆分節(jié)點,將拆分節(jié)點插 入到主樹中作為新建主樹節(jié)點,為新建主樹節(jié)點分配新建從樹,并將新建主 樹節(jié)點的外部指針指向新建從樹,將當(dāng)前從樹中位于拆分節(jié)點左側(cè)的全部節(jié) 點搬移到新建從樹中,然后進(jìn)入步驟301;步驟305:將待插節(jié)點插入到當(dāng)前從樹中。本發(fā)明實施例所述的插入方法保證了從樹的高度不會隨著數(shù)據(jù)的插入過 度增長,從而減少了后續(xù)節(jié)點插入的時間,提高了節(jié)點的插入速度。具體地,如圖4所示,本發(fā)明實施例給出了上述根據(jù)待插節(jié)點的關(guān)鍵碼值 在主樹中查找最近主樹節(jié)點,以最近主樹節(jié)點的外部指針指向的從樹作為當(dāng) 前從樹的一種實現(xiàn)方式,以二叉樹為例,包括讀取主樹根節(jié)點的外部指針,設(shè)置變量為上述主樹根節(jié)點的外部指針, 將上述根節(jié)點作為當(dāng)前節(jié)點;判斷待插節(jié)點關(guān)鍵碼值是否大于上述主樹節(jié)點的關(guān)鍵碼值,設(shè)置上述變 量為上述主樹節(jié)點的左子節(jié)點的外部指針,將上述左子節(jié)點作為當(dāng)前節(jié)點, 若否,將上述當(dāng)前節(jié)點的右子節(jié)點作為當(dāng)前節(jié)點;判斷當(dāng)前節(jié)點是否為葉子節(jié)點,若是,以上述變量指向的從樹作為當(dāng)前 從樹。上述實施方式,還還可以包括判斷當(dāng)前節(jié)點是否為空或無效,若是,以上述變量指向的從樹作為當(dāng)前 從樹。具體還可以包括以下步驟步驟401:讀取主樹根節(jié)點的外部指針,設(shè)置變量為上述主樹根節(jié)點的外 部指針,將上述主樹根節(jié)點作為當(dāng)前主樹節(jié)點;假設(shè)上述變量用Pointer表示,則可以為Pointer =主樹根節(jié)點的外部指針; 步驟402:判斷當(dāng)前主樹節(jié)點是否為空或無效,若是,進(jìn)入步驟403,若 否,進(jìn)入步驟404;步驟403:以上述變量指向的從樹作為當(dāng)前從樹;步驟404:判斷待插節(jié)點關(guān)鍵碼值是否大于上述當(dāng)前主樹節(jié)點的關(guān)鍵碼 值,若是,進(jìn)入步驟405,若否,進(jìn)入步驟406;步驟405:設(shè)置上述變量為上述當(dāng)前主樹節(jié)點的左子節(jié)點的外部指針(可 以表示為PointeF左子節(jié)點的外部指針),將上述左子節(jié)點作為當(dāng)前主樹節(jié) 點,進(jìn)入步驟407;若這里的樹為多叉樹,那么上述設(shè)置上述變量為上述當(dāng)前主樹節(jié)點的左 子節(jié)點的外部指針之前還包括查找當(dāng)前主樹節(jié)點的左子節(jié)點中小于且最接 近于待查節(jié)點的節(jié)點,然后設(shè)置上述變量為上述查找到的主樹節(jié)點的左子節(jié) 點。 -步驟406:將上述當(dāng)前主樹節(jié)點的右子節(jié)點作為當(dāng)前主樹節(jié)點(此時Pointer 沒有改變),進(jìn)入步驟407。若這里的樹為多叉樹,那么上述將當(dāng)前主樹節(jié)點的右子節(jié)點作為當(dāng)前主 樹節(jié)點之前還包括查找上述當(dāng)前主樹節(jié)點的右子節(jié)點鐘小于且最接近于待 查節(jié)點的節(jié)點,然后將上述查找到的當(dāng)前主樹節(jié)點的右子節(jié)點作為當(dāng)前主樹 節(jié)點。步驟407:判斷上述當(dāng)前主樹節(jié)點是否為上述當(dāng)前主樹節(jié)點所在的主樹的 葉子節(jié)點;若是,進(jìn)入步驟403;若否,進(jìn)入步驟402;上述實施方式提供了根據(jù)待插節(jié)點的關(guān)鍵碼值在主樹中查找最近主樹節(jié) 點,以最近主樹節(jié)點的外部指針指向的從樹作為當(dāng)前從樹的一種實現(xiàn)方式, 可以理解的是實現(xiàn)的方案還有很多,上述舉例不應(yīng)理解為實現(xiàn)方案的窮舉, 故上述實施方式不應(yīng)理解為對本發(fā)明實施例的限定。進(jìn)一步地,還可以對主樹進(jìn)行平衡才喿作;經(jīng)平tf操作后主樹的有效節(jié)點 在主樹中具有最小的深度。具體地,觸發(fā)對主樹進(jìn)行平衡操作的條件可以是在上述主樹的某一深 度的節(jié)點處于未滿狀態(tài),且上述某一深度非上述主樹的最下層時,執(zhí)行對主樹進(jìn)行平衡操作;或在最下層節(jié)點以上的各深度節(jié)點中,為空的數(shù)量達(dá)到設(shè)定值時,執(zhí)行對 主樹進(jìn)行平衡操作??梢岳斫獾氖怯|發(fā)對主樹進(jìn)行平衡的條件還可以有很多,例如還可以 是在存儲系統(tǒng)處于閑置狀態(tài)時對主樹進(jìn)行平衡操作;故上述兩種舉例不應(yīng)理 解為對本發(fā)明實施例的限定。上述實施方式通過對主樹進(jìn)行平衡操作可以降低主樹的高度,從而進(jìn)一 步提高插入速度。實施例二,如圖5所示,本發(fā)明實施例還提供了一種基于樹形數(shù)據(jù)結(jié)構(gòu)節(jié) 點的查找方法,可以包括以下步驟步驟501:根據(jù)待查節(jié)點的關(guān)鍵碼值在主樹中查找待查找節(jié)點;若主樹中 不存在上述待查節(jié)點,則查找最近主樹節(jié)點;上述最近主樹節(jié)點的關(guān)鍵碼值 'J 、于且最接近待插節(jié)點的關(guān)鍵碼值;若主樹中存在節(jié)點與待查節(jié)點具有相同的關(guān)鍵碼值,這時就已經(jīng)找到了 待查找節(jié)點,查找流程可以結(jié)束;步驟502:以上述最近主樹節(jié)點的外部指針指向的從樹作為當(dāng)前從樹;步驟503:在上述當(dāng)前從樹中查找上述待查找節(jié)點。上述查找的實現(xiàn)方式中,由于降低了樹的高度,節(jié)點的查找速度也會決。具體地,如圖6所示,本發(fā)明實施例給出了上述才艮據(jù)待查節(jié)點的關(guān)4定碼值 在主樹中查找最近主樹節(jié)點,以最近主樹節(jié)點的外部指針指向的從樹作為當(dāng) 前從樹的一種實現(xiàn)方式,以二叉樹為例,包括以下步驟步驟601:讀取主樹根節(jié)點的外部指針,設(shè)置變量為上述主樹根節(jié)點的外 部指針,將上述主樹根節(jié)點作為當(dāng)前主樹節(jié)點;假設(shè)上述變量用Pointer表示,則可以為Pointer =主樹根節(jié)點的外部指針;步驟602:判斷當(dāng)前主樹節(jié)點是否為空或無效,若是,進(jìn)入步驟603,若 否,進(jìn)入步驟604;步驟603:以當(dāng)前變量指向的從樹作為當(dāng)前從樹;步驟604:判斷待查節(jié)點關(guān)鍵碼值是否大于上述當(dāng)前主樹節(jié)點的關(guān)鍵碼 值,若是,進(jìn)入步驟605,若否,進(jìn)入步驟606;步驟605:設(shè)置上述變量為上述當(dāng)前主樹節(jié)點的左子節(jié)點的外部指針(可 以表示為Pointe產(chǎn)左子節(jié)點的外部指針),將上述左子節(jié)點作為當(dāng)前主樹節(jié) 點,進(jìn)入步驟607;步驟606:將上述當(dāng)前主樹節(jié)點的右子節(jié)點作為當(dāng)前主樹節(jié)點(此時Pointer 沒有改變),進(jìn)入步驟607。步驟607:判斷上述當(dāng)前主樹節(jié)點是否為上述當(dāng)前主樹節(jié)點所在的主樹的 葉子節(jié)點;若是,進(jìn)入步驟603;若否,進(jìn)入步驟602;上述實施方式提供了才艮據(jù)待查節(jié)點的關(guān)鍵碼值在主樹中查找最近主樹節(jié) 點,以最近主樹節(jié)點的外部指針指向的從樹作為當(dāng)前從樹的一種實現(xiàn)方式, 可以理解的是實現(xiàn)的方案還有很多,上述舉例不應(yīng)理解為實現(xiàn)方案的窮舉, 故上述實施方式不應(yīng)理解為對本發(fā)明實施例的限定。實施例三,如圖7所示,本發(fā)明實施例還提供了一種基于樹形數(shù)據(jù)結(jié)構(gòu)節(jié) 點的刪除方法,可以包括以下步驟步驟701:根據(jù)待刪節(jié)點的關(guān)鍵碼值在主樹中查找待刪節(jié)點,若主樹中不 存在上述待刪節(jié)點,則查找最近主樹節(jié)點;上述最近主樹節(jié)點的關(guān)4定碼值小 于且最接近待刪節(jié)點的關(guān)鍵碼值;若主樹中存在節(jié)點與待刪節(jié)點具有相同的關(guān)鍵碼值,這時就已經(jīng)找到了 待刪節(jié)點,可以直接進(jìn)入步驟704;步驟702:以最近主樹節(jié)點的外部指針指向的從樹作為當(dāng)前從樹;步驟703:在上述當(dāng)前從樹中查找上述待刪節(jié)點;步驟704:刪除上述查找到的待刪節(jié)點。可以看到,本實施例的實現(xiàn)方法可以在實施例二的基礎(chǔ)上進(jìn)行,首先查 找待刪節(jié)點,然后刪除待刪節(jié)點。若刪除的節(jié)點為主樹節(jié)點時,可以對主樹 節(jié)點指向的從樹節(jié)點和下層節(jié)點進(jìn)行重新排序,排序的過程可以是將這些節(jié) 點重新插入;若刪除的節(jié)點為從樹的節(jié)點,則可以對該乂人樹的節(jié)點進(jìn)行排序。上述實施例中,由于樹的高度降低了,能夠更快地查找到待刪節(jié)點,從 而加快了刪除節(jié)點的速度。進(jìn)一步地,樹中的節(jié)點被刪除后會出現(xiàn)一些未滿的樹,還可以進(jìn)行樹的 合并操作,具體可以為主樹中的第一正整數(shù)個相鄰的節(jié)點指向的從樹中的有效節(jié)點數(shù),小于第
二正整數(shù)個從樹能夠容納的節(jié)點數(shù)時(上述第一正整數(shù)大于第二正整數(shù))
將上述主樹中的第一正整數(shù)個相鄰節(jié)點,及上述第一正整數(shù)個節(jié)點分別
指向的從樹,合并為第二正整數(shù)個主樹節(jié)點,以及與上述第二正整數(shù)個主 樹節(jié)點指向的從樹。
舉例說明,假設(shè)上述第一正整數(shù)為2,上述第二正整數(shù)為l則
當(dāng)主樹中兩個相鄰的節(jié)點指向的從樹中的有效節(jié)點數(shù),小于一個從樹能 夠容納的節(jié)點數(shù)時;
將上述主樹中,兩個相鄰節(jié)點中較大的主樹節(jié)點,及其指向的從樹中的 有效節(jié)點,插入上述兩個相鄰節(jié)點中較'』、的主樹節(jié)點指向的從樹中。
可以理解的是,上述對樹的合并過程是可以為將需要合并的主樹節(jié)點, 以及上述主樹節(jié)點指向的從樹的有效節(jié)點,再次插入本發(fā)明實施例的樹形數(shù) 據(jù)結(jié)構(gòu)中的過程。另外觸發(fā)進(jìn)行樹的合并的條件可以有很多種,例如還可以 是在存儲系統(tǒng)處于閑置狀態(tài)時進(jìn)行,可以理解的是上述觸發(fā)進(jìn)行樹的合并的 條件的舉例不應(yīng)理解為對本發(fā)明實施例的限定。
上述實施例中通過合并處于未滿狀態(tài)的從樹可以釋放出一些存儲資源, 可以^提高存儲空間的利用率。
實施例四,如圖8所示,本發(fā)明實施例還提供了另一種樹形數(shù)據(jù)結(jié)構(gòu)節(jié)點 插入的方法,可以包括以下步驟
步驟801:才艮據(jù)待插節(jié)點的關(guān)鍵:碼值在主樹中查找最近的主樹節(jié)點,上述 最近的主樹節(jié)點的關(guān)鍵碼值大于且最接近于待插節(jié)點的關(guān)鍵碼值;上述主樹 的根節(jié)點初始化為具有最大的關(guān)鍵碼值;其中,上述主樹包括父節(jié)點、上述 父節(jié)點的左子節(jié)點和上述父節(jié)點的右子節(jié)點,且上述左子節(jié)點大于上述父節(jié) 點,上述父節(jié)點大于上述右子節(jié)點
在一棵樹中,插入的節(jié)點的關(guān)鍵碼值會在一個數(shù)域內(nèi)取值,上述最大關(guān) 鍵碼值可以是上述數(shù)域中最大的數(shù),也可以是大于上述數(shù)域中的所有數(shù)的任 意值;
步驟802:以最近主樹節(jié)點的外部指針指向的從樹作為當(dāng)前從樹; 步驟803:判斷當(dāng)前從樹是否已滿,若是,則進(jìn)入步驟804,若否,則進(jìn)入步驟805;
步驟804:在當(dāng)前從樹中任意選擇一個節(jié)點作為拆分節(jié)點,將拆分節(jié)點插 入到主樹中作為新建主樹節(jié)點,為新建主樹節(jié)點分配新建從樹,并將新建主 樹節(jié)點的外部指針指向新建從樹,將當(dāng)前從樹中位于拆分節(jié)點右側(cè)的全部節(jié) 點搬移到新建從樹中,然后進(jìn)入步驟801;
步驟805:將待插節(jié)點插入到當(dāng)前從樹中。
上述實施例中,將樹形數(shù)據(jù)結(jié)構(gòu)的樹分成主樹和從樹降低了樹的高度, 減少了數(shù)據(jù)插入的時間,提高了節(jié)點的插入速度。
具體地,如圖9所示,本發(fā)明實施例給出了上述根據(jù)待插節(jié)點的關(guān)4走碼值 在主樹中查找最近主樹節(jié)點,以最近主樹節(jié)點的外部指針指向的從樹作為當(dāng) 前從樹的一種實現(xiàn)方式,以二叉樹為例,包括以下步驟
步驟901:讀取主樹根節(jié)點的外部指針,設(shè)置變量為上述主樹根節(jié)點的外 部指針,將上述^f艮節(jié)點作為當(dāng)前節(jié)點;
假設(shè)上述變量用Pointer表示,則可以為Pointer =根節(jié)點的外部指針;
步驟902:判斷當(dāng)前節(jié)點是否為空或無效,若是,進(jìn)入步驟903,若否, 進(jìn)入步驟904;
步驟903:以上述變量指向的從樹作為當(dāng)前從樹;
步驟904:判斷待插節(jié)點關(guān)鍵碼值是否大于上述主樹節(jié)點的關(guān)鍵碼值,若 是,進(jìn)入步驟906,若否,進(jìn)入步驟905;
步驟905:設(shè)置上述變量為上述主樹節(jié)點的右子節(jié)點的外部指針(可以表 示為Pointer二左子節(jié)點的外部指針),將上述右子節(jié)點作為當(dāng)前節(jié)點,進(jìn)入 步驟907;
步驟906:將上述當(dāng)前節(jié)點的左子節(jié)點作為當(dāng)前節(jié)點(此時Pointer沒有改 變),進(jìn)入步驟907。
步驟907:判斷上述當(dāng)前節(jié)點是否為上述主樹的葉子節(jié)點;若是,進(jìn)入步 驟903;若否,進(jìn)入步驟902;
上述實施方式提供了根據(jù)待插節(jié)點的關(guān)鍵碼值在主樹中查找最近主樹節(jié) 點,以最近主樹節(jié)點的外部指針指向的從樹作為當(dāng)前從樹的一種實現(xiàn)方式, 可以理解的是實現(xiàn)的方案還有很多,上述舉例不應(yīng)理解為實現(xiàn)方案的窮舉,故上述實施方式不應(yīng)理解為對本發(fā)明實施例的限定。
上述實施例四與實施一的方案具有的實現(xiàn)思想相同,區(qū)別點在于本實 施例中主樹的根節(jié)點的關(guān)4走碼值在進(jìn)行初始化時設(shè)置為最大值。節(jié)點的查找 和刪除的方法與實施例一和實施例二相同,首先在主樹中查找待查/刪節(jié)點, 失敗后,查找最近主樹節(jié)點,然后在最近主樹節(jié)點的外部指針指向的從樹中 查找到待查/刪節(jié)點,然后刪除待刪節(jié)點。在此不再贅述。另,如果最近主樹 節(jié)點的外部指針指向了多棵從樹,可以參考多叉樹的插入、查找和刪除的方 法。
實施例五,如圖10所示,本發(fā)明實施例還提供了一種存儲裝置,包括 從樹存儲單元IOOI,用于存儲從樹;
主樹存儲單元1002,用于存儲主樹,主樹中的節(jié)點具有指向從樹的外部 指針;上述主樹的根節(jié)點初始化為具有最小的關(guān)鍵碼值,上述主樹中的左子 節(jié)點大于父節(jié)點,父節(jié)點大于右子節(jié)點。
可選地,上述從樹存儲單元和上述主樹存儲單元均為隨機(jī)存取存儲器。 當(dāng)然采用其它類型的存儲器來存儲主樹或從樹也是可以的,本發(fā)明實施例對 此不作限定。
實施例六,如圖ll所示,本發(fā)明實施例還提供了一種插入裝置IIOO,上 述插入裝置包括
查找單元1101,用于根據(jù)待插節(jié)點的關(guān)鍵碼值在主樹中查找最近主樹節(jié) 點,在搬移單元1103將當(dāng)前從樹中位于拆分節(jié)點右側(cè)的全部節(jié)點搬移到新建 從樹中后執(zhí)行查找最近主樹節(jié)點,上述最近主樹節(jié)點的關(guān)鍵碼值d、于且最接 近待插節(jié)點的關(guān)鍵碼值;上述主樹的根節(jié)點初始化為具有最小的關(guān)鍵碼值; 上述主樹中的左子節(jié)點大于父節(jié)點,父節(jié)點大于右子節(jié)點;
判斷單元1102,用于以最近主樹節(jié)點的外部指針指向的從樹作為當(dāng)前從 樹,判斷當(dāng)前從樹是否已滿;
^:移單元1103,用于在當(dāng)前從樹已滿時,在當(dāng)前/人樹中任意選擇一個節(jié) 點作為拆分節(jié)點,將拆分節(jié)點插入到主樹中作為新建主樹節(jié)點,為新建主樹 節(jié)點分配新建從樹,并將新建主樹節(jié)點的外部指針指向新建從樹,將當(dāng)前從 樹中位于拆分節(jié)點左側(cè)的全部節(jié)點搬移到新建從樹中;插入單元1104,用于在當(dāng)前從樹未滿時,將待插節(jié)點插入到當(dāng)前從樹中。
如圖12所示,上述插入裝置還可以包括'.
平衡單元1201,用于對主樹進(jìn)行平衡處理。經(jīng)平衡操作后主樹的有效節(jié) 點在主樹中具有最小的深度。
實施例七,如圖13所示,本發(fā)明實施例還^是供了一種查找裝置1300,包 括第一查找單元1301,用于根據(jù)待查節(jié)點的關(guān)鍵碼值在主樹中查找待查節(jié) 點,若主樹中不存在上述待查節(jié)點,則查找最近主樹節(jié)點;上述最近主樹節(jié) 點的關(guān)鍵碼值小于且最接近待插節(jié)點的關(guān)鍵碼值;若主樹中存在上述待查節(jié) 點,則在主樹中已經(jīng)查找到需要查找的節(jié)點,查找流程結(jié)束;
待查節(jié)點查找單元1302,用于以上述最近主樹節(jié)點的外部指針指向的從 樹作為當(dāng)前從樹;在上述當(dāng)前/人樹中查找上述待查找節(jié)點。
上述查找裝置可以為現(xiàn)場可編程門陣列或?qū)S眉呻娐?;?dāng)然采用其 它類型的物理實體來實現(xiàn)上述查找裝置1300的功能也是可以的,對此本發(fā)明 實施例不作限定。
實施例八,如圖14所示,本發(fā)明實施例還^是供了一種刪除裝置1400包括
第二查找單元1401 ,用于根據(jù)待刪節(jié)點的關(guān)鍵碼值在主樹中查找待刪節(jié) 點,若主樹中不存在上述待刪節(jié)點,則查找最近主樹節(jié)點;上述最近主樹節(jié) 點的關(guān)鍵碼值'J 、于且最接近待刪節(jié)點的關(guān)鍵碼值;
待刪節(jié)點查找單元1402,用于以最近主樹節(jié)點的外部指針指向的從樹作 為當(dāng)前從樹;在上述當(dāng)前從樹中查找上述待刪節(jié)點;
刪除單元1403,刪除上述查找到的待刪節(jié)點。
實施例九,如圖15所示,本發(fā)明實施例還提供了一種合并裝置1500,包
括
檢測單元1501,用于檢測上述主樹中的第一正整數(shù)個相鄰的節(jié)點指向的 從樹中的有效節(jié)點數(shù),小于第二正整數(shù)個從樹能夠容納的節(jié)點數(shù),且上述第 一正整數(shù)大于第二正整數(shù)
合并單元1502:在檢測單元1501檢測結(jié)果為是時,用于將上述主樹中的 第一正整數(shù)個相鄰節(jié)點,及上述第一正整數(shù)個節(jié)點分別指向的從樹,合并為 第二正整數(shù)個主樹節(jié)點,以及與上述第二正整數(shù)個主樹節(jié)點指向的從樹。
1實施例十,如圖16所示,本發(fā)明實施例還提供了另一種插入裝置1600, 包括
查找單元1601,用于根據(jù)待插節(jié)點的關(guān)鍵碼值在主樹中查找最近的主樹 節(jié)點,在搬移單元1603將當(dāng)前從樹中位于拆分節(jié)點右側(cè)的全部節(jié)點搬移到新 建從樹中后執(zhí)行查找最近主樹節(jié)點,上述最近主樹節(jié)點的關(guān)鍵碼值大于且最 接近待插節(jié)點的關(guān)鍵碼值;上述主樹的根節(jié)點初始化為具有最大的關(guān)鍵碼值; 上述主樹中的左子節(jié)點大于父節(jié)點,父節(jié)點大于右子節(jié)點;
判斷單元1602,用于以最近主樹節(jié)點的外部指針指向的從樹作為當(dāng)前從 樹,判斷當(dāng)前從樹是否已滿,
搬移單元1603,若判斷單元1602判斷結(jié)果為是,則用于在當(dāng)前從樹中任 意選擇一個節(jié)點作為拆分節(jié)點,將拆分節(jié)點插入到主樹中作為新建主樹節(jié)點, 為新建主樹節(jié)點分配新建從樹,并將新建主樹節(jié)點的外部指針指向新建從樹, 將當(dāng)前從樹中位于拆分節(jié)點右側(cè)的全部節(jié)點搬移到新建從樹中;
插入單元1604,若判斷單元1602判斷結(jié)果為是否,則用于將待插節(jié)點插 入到當(dāng)前從樹中。
實施例十一,本發(fā)明實施例還提供了一種通信設(shè)備,包括
實施例五所述的存儲裝置,和實施例六到實施例九所述的至少一個裝置; 或者,實施例五所述的存儲裝置,和實施例六到實施例九、實施例十所述的 至少一個裝置。
實施例十二,本發(fā)明實施例還提供了上述實施例一到實施例十一的方法 或裝置一個應(yīng)用場景,如圖17所示,可以一并參考圖18,包括
現(xiàn)場可編程門陣列1703 ( Field-programmable gate array, FPGA ),上述現(xiàn) 場可編程門陣列1703也可以為專用集成電路(Application Specific Intergrated Circuits , ASIC);
現(xiàn)場可編程門陣列1703可以具有兩個接口 與中央處理器1701連接的管 理接口和與查找控制裝置1702連接的查找接口 ;上述查找控制裝置1702可以 為路由器的網(wǎng)絡(luò)處理器;
晶片內(nèi)建隨機(jī)存取存儲器1704 ( Onchip RAM)可以集成于現(xiàn)場可編程門 陣列1703內(nèi)部,在現(xiàn)場可編程門陣列1703的外部還可以有隨機(jī)存取存儲器1705 (Random-access memory , RAM);晶片內(nèi)建隨才踏取存儲器1704和隨機(jī) 存取存儲器1705,共同用于存儲主樹和從樹;在本實施例中,可以只有晶片 內(nèi)建隨機(jī)存取存儲器1704,用于存儲主樹和從樹,也可以只有隨機(jī)存取存儲 器1705,用于存儲主樹和從樹;圖18中的虛線三角形為本發(fā)明實施例的樹在 晶片內(nèi)建隨機(jī)存取存儲器1704和隨機(jī)存取存儲器1705存儲的一個示意,大致 表示了在所述晶片內(nèi)建隨才錄M儲器1704和隨機(jī)存取存儲器1705中存儲的 樹的各部分的位置;
查找控制裝置1702可以通過查找接口向現(xiàn)場可編程門陣列1703發(fā)送查找 指令,然后通過查找接口接收查找的結(jié)果;上述查找過程的執(zhí)行主體可以為 現(xiàn)場可編程門陣列1703,具體查找的實現(xiàn),可以參考前述的方法或裝置實施 例來實現(xiàn)。
中央處理器1701可以通過管理端口向現(xiàn)場可編程門陣列1703發(fā)送管理樹 的命令,上述管理樹的命令可以為插入、或者刪除等命令;現(xiàn)場可編程門陣 列1703接收到管理樹的命令后,對樹進(jìn)行管理;對樹管理的具體實現(xiàn)可以參 考前述的方法或裝置實施例插入、刪除等的實現(xiàn)。
本實施例中,中央處理器1701、現(xiàn)場可編程門陣列1703、晶片內(nèi)建隨機(jī) 存取存儲器]704和隨機(jī)存取存儲器1705可以處于同一個通信設(shè)備中;查找控 制裝置1702可以與上述通信設(shè)備通過查找接口連接,處于上述通信設(shè)備的外 部。
本實施例中,現(xiàn)場可編程門陣列1703可以只有管理接口,此時,圖17中 的查找控制裝置1702是不必要的;現(xiàn)場可編程門陣列1703也可以只有查找接 口,此時,圖17中的中央處理器1701是不必要的。
在本實施例中,關(guān)鍵碼值可以是介質(zhì)訪問控制(Media Access Control , MAC)地址的值,也可是MAC地址與其它信息的組合;上述其它信息可以為 虛擬局域網(wǎng)(Virtual Local Area Network, VLAN)地址等,本實施例對上述 其它信息不作限定,可以理解的是,上述MAC地址、VLAN地址、MAC地址 與其它信息的組合的舉例不是關(guān)鍵碼值的類型的窮舉,不應(yīng)理解為對本發(fā)明 實施例的限定。
本發(fā)明實施例還給出了 ,在路由器中使用實施例一到實施例十一中任意一種方法或裝置思想的實施例
如圖19所示,為一種從本發(fā)明實施例的樹形數(shù)據(jù)結(jié)構(gòu)中查找數(shù)據(jù)的方法 實施例,可以包括以下步驟
步驟1901:路由器接收數(shù)據(jù)報文;
上述數(shù)據(jù)報文可以為在路由器的任意物理輸入端口輸入的數(shù)據(jù)4艮文;
步驟1902:路由器根據(jù)上述數(shù)據(jù)報文攜帶的需要查找的數(shù)據(jù)的關(guān)鍵碼值, 在主樹/從樹中查找與上述關(guān)4走碼值相同的節(jié)點;上述主樹和從樹可以存儲在 路由器的存儲器中;
上述步驟1902具體查找方法可以參考實施例二的方法;上述才艮文可以為 二層轉(zhuǎn)發(fā)數(shù)據(jù)報文,上述關(guān)鍵碼可以表示為MAC地址、也可以表示為MAC 地址和VLAN信息;
步驟1903:路由器讀取查找到的節(jié)點的數(shù)據(jù)信息,并將上述數(shù)據(jù)信息更 新到上述數(shù)據(jù)報文;
步驟1904:路由器將上述更新后的數(shù)據(jù)報文從上述查找到的節(jié)點的數(shù)據(jù) 信息指示的端口輸出。
如圖20所示,為一種更新本發(fā)明實施例的樹形數(shù)據(jù)結(jié)構(gòu)中的數(shù)據(jù)的方法 實施例,可以包括以下步驟
步驟2001:路由器的端口接收協(xié)議報文,并將上述協(xié)議報文發(fā)送給CPU;
步驟2002: CPU獲得所述報文的關(guān)鍵碼值;獲得的方式可以是對協(xié)議報 文進(jìn)行解析,得到關(guān)鍵碼值;
步驟2003: CPU發(fā)送插入命令給FPGA,命令將上述關(guān)鍵碼值的協(xié)議報文 插入到主樹/從樹中。具體的插入方法可以參考實施例一的方法。
上述協(xié)議報文可以是地址解析協(xié)議(Address Resolution Protocol, ARP ) 表項;當(dāng)然上述協(xié)議報文也可以是其它類型的協(xié)議報文,本發(fā)明實施例對此 不作限定;
如圖21所示,為更新本發(fā)明實施例的樹形數(shù)據(jù)結(jié)構(gòu)中的數(shù)據(jù)的另 一種方 法實施例,可以包括以下步驟
步驟2101:路由器的端口接收數(shù)據(jù)報文;步驟2102:根據(jù)上述數(shù)據(jù)報文的指示或上述數(shù)據(jù)報文的輸入端口信息, 發(fā)送插入消息給CPU;上述插入消息包含關(guān)鍵碼值;上述關(guān)鍵碼值為上述數(shù) 據(jù)報文的關(guān)鍵碼值;
步驟2103: CPU解析上述插入消息得到關(guān)鍵碼值,然后發(fā)送插入命令給 FPGA,命令將上述關(guān)鍵碼值的數(shù)據(jù)報文插入到主樹/從樹中。具體的插入方法 可以參考實施例 一 的方法。
上述數(shù)據(jù)報文可以是MAC表項;當(dāng)然協(xié)議報文也可以是其它類型的數(shù)據(jù) 報文,本發(fā)明實施例對此不作限定。所述插入消息用于指示要在主樹/從樹中 插入數(shù)據(jù)。
在上述實施例中路由器采用樹形數(shù)據(jù)結(jié)構(gòu)來實現(xiàn)大容量表項的插入,由 于本發(fā)明實施例中的樹形數(shù)據(jù)結(jié)構(gòu)降低了樹的高度,可以提高表項的插入速率。
上述實施例中,將樹形數(shù)據(jù)結(jié)構(gòu)的樹分成主樹和從樹降低了樹的高度, 減少了節(jié)點插入的時間,提高了節(jié)點的插入速度。由于樹的高度降低了,可 以更快的查找到待查節(jié)點、待刪節(jié)點,從而提高了查找節(jié)點和刪除節(jié)點的速 度。通過平衡主樹可以降低主樹的高度,從而進(jìn)一步降低整棵樹的高度,提 高插入、查找、刪除節(jié)點的速度。另外通過對從樹的合并釋放存儲資源達(dá)到 了提高存儲空間利用率的效果。
本領(lǐng)域普通技術(shù)人員可以理解實現(xiàn)上述實施例方法中的全部或部分步驟 是可以通過程序來指令相關(guān)的硬件完成,所述的程序可以存儲于一種計算機(jī) 可讀存儲介質(zhì)中,上述提到的存儲介質(zhì)可以是存儲器(RAM)、內(nèi)存、只讀存 儲器(ROM)、電可編程ROM、電可擦除可編程ROM、寄存器、硬盤、可移 動磁盤、CD-ROM、或技術(shù)領(lǐng)域內(nèi)所公知的任意其它形式的存儲介質(zhì)中。
以上對本發(fā)明實施例所提供的基于樹形數(shù)據(jù)結(jié)構(gòu)節(jié)點的插入的方法和存
進(jìn)行了闡述,以上實施例的說明只是用于幫助理解本發(fā)明的方法及其核心思 想;同時,對于本領(lǐng)域的一般技術(shù)人員,依據(jù)本發(fā)明的思想,在具體實施方 式及應(yīng)用范圍上均會有改變之處,綜上所述,本說明書內(nèi)容不應(yīng)理解為對本 發(fā)明的限制。
權(quán)利要求
1、一種基于樹形數(shù)據(jù)結(jié)構(gòu)節(jié)點的插入方法,其特征在于,包括根據(jù)待插節(jié)點的關(guān)鍵碼值在主樹中查找最近主樹節(jié)點,所述最近主樹節(jié)點的關(guān)鍵碼值小于且最接近待插節(jié)點的關(guān)鍵碼值;所述主樹的根節(jié)點初始化為具有最小的關(guān)鍵碼值;其中,所述主樹包括父節(jié)點、所述父節(jié)點的左子節(jié)點和所述父節(jié)點的右子節(jié)點,且所述左子節(jié)點大于所述父節(jié)點,所述父節(jié)點大于所述右子節(jié)點;以最近主樹節(jié)點的外部指針指向的從樹作為當(dāng)前從樹,判斷當(dāng)前從樹是否已滿,若是,則在當(dāng)前從樹中任意選擇一個節(jié)點作為拆分節(jié)點,將拆分節(jié)點插入到主樹中作為新建主樹節(jié)點,為新建主樹節(jié)點分配新建從樹,并將新建主樹節(jié)點的外部指針指向新建從樹,將當(dāng)前從樹中位于拆分節(jié)點左側(cè)的全部節(jié)點搬移到新建從樹中,然后執(zhí)行查找最近主樹節(jié)點,若否,則將待插節(jié)點插入到當(dāng)前從樹中。
2、 根據(jù)權(quán)利要求l所述方法,其特征在于,所述根據(jù)待插節(jié)點的關(guān)鍵碼 值在主樹中查找最近主樹節(jié)點,以最近主樹節(jié)點的外部指針指向的從樹作為 當(dāng)前/人樹具體為讀取主樹根節(jié)點的外部指針,設(shè)置變量為所述主樹根節(jié)點的外部指針, 將所述^f艮節(jié)點作為當(dāng)前節(jié)點;判斷待插節(jié)點關(guān)鍵碼值是否大于所述主樹節(jié)點的關(guān)鍵碼值,設(shè)置所述變 量為所述主樹節(jié)點的左子節(jié)點的外部指針,將所述左子節(jié)點作為當(dāng)前節(jié)點, 若否,將所述當(dāng)前節(jié)點的右子節(jié)點作為當(dāng)前節(jié)點;判斷當(dāng)前節(jié)點是否為葉子節(jié)點,若是,以所述變量指向的從樹作為當(dāng)前 從樹。.
3、 根據(jù)權(quán)利要求2所述方法,其特征在于,還包括 判斷當(dāng)前節(jié)點是否為空或無效,若是,以所述變量指向的從樹作為當(dāng)前從樹。
4、 根據(jù)權(quán)利要求l所述方法,其特征在于,還包括對主樹進(jìn)行平衡操作, 所述對主樹進(jìn)行平衡操作包括在所述主樹的某一深度的節(jié)點處于未滿狀態(tài),且所述某一深度非所述主樹的最下層時,執(zhí)行對主樹進(jìn)行平衡操作;或在最下層節(jié)點以上的各深度節(jié)點的為空的數(shù)量達(dá)到設(shè)定值時,執(zhí)行對主 樹進(jìn)行平衡操作。
5、 根據(jù)權(quán)利要求1至4任意一項所述方法,其特征在于,所述當(dāng)前從樹是 否已滿包括所述當(dāng)前從樹的使用率是否達(dá)到設(shè)定的使用率,若是,則確定所述當(dāng)前 從樹已滿,若否,則確定所述當(dāng)前從樹未滿。
6、 根據(jù)權(quán)利要求1至4任意一項所述方法,其特征在于,所述根據(jù)待插節(jié) 點的關(guān)鍵碼值在主樹中查找最近主樹節(jié)點之前還包括通過路由器的輸入端口接收報文,并獲得所述報文的關(guān)鍵碼值; 所述將待插節(jié)點插入到當(dāng)前從樹中包括 將所述關(guān)鍵碼值的協(xié)議々艮文插入當(dāng)前從樹中。
7、 根據(jù)權(quán)利要求1至4任意一項所述方法,其特征在于,還包括 根據(jù)待查節(jié)點的關(guān)鍵碼值在主樹中查找待查節(jié)點,若主樹中不存在上述待查節(jié)點,則查找最近主樹節(jié)點;所述最近主樹節(jié)點的關(guān)鍵碼值小于且最接 近待插節(jié)點的關(guān)鍵碼值;以所述最近主樹節(jié)點的外部指針指向的從樹作為當(dāng)前/人樹;在所述當(dāng)前從樹中查找所述待查找節(jié)點;或還包括根據(jù)待刪節(jié)點的關(guān)鍵碼值在主樹中查找待刪節(jié)點,若主樹中不存在上述 待刪節(jié)點,則查找最近主樹節(jié)點;所述最近主樹節(jié)點的關(guān)鍵碼值小于且最接 近待刪節(jié)點的關(guān)鍵碼值;以最近主樹節(jié)點的外部指針指向的從樹作為當(dāng)前從樹;在所述當(dāng)前從樹中查找所述待刪節(jié)點;刪除所述查找到的待刪節(jié)點。
8、 根據(jù)權(quán)利要求7所述方法,其特征在于,所述根據(jù)待查節(jié)點的關(guān)鍵碼 值在主樹中查找待查節(jié)點之前還包括通過路由器的輸入端口接收數(shù)據(jù)報文,并得到所述數(shù)據(jù)報文需要查找的 數(shù)據(jù)的關(guān)鍵碼值即為待查節(jié)點的關(guān)鍵碼值;所述在當(dāng)前從樹中查找待查找節(jié)點之后還包括讀取查找到的節(jié)點的數(shù)據(jù)信息,并請上述數(shù)據(jù)信息更新到所述數(shù)據(jù)才艮文; 然后將所述更新后的數(shù)據(jù)報文從所述查找到的節(jié)點的數(shù)據(jù)信息指示的端口輸 出;和/或所述刪除所述查找到的待刪節(jié)點之后還包括當(dāng)所述主樹中的第一正整數(shù)個相鄰的節(jié)點指向的從樹中的有效節(jié)點數(shù), 小于第二正整數(shù)個從樹能夠容納的節(jié)點數(shù),且所述第一正整數(shù)大于第二正整 數(shù)時將所述主樹中的第 一正整數(shù)個相鄰節(jié)點,及所述第一正整數(shù)個節(jié)點分別 指向的從樹,合并為第二正整數(shù)個主樹節(jié)點,以及與所述第二正整數(shù)個主 樹節(jié)點指向的從樹。
9、 根據(jù)權(quán)利要求8所述方法,其特征在于,所述主樹中的第一正整數(shù)個 相鄰的節(jié)點指向的從樹中的有效節(jié)點數(shù),小于第二正整數(shù)個從樹能夠容納的 節(jié)點數(shù)包括主樹中兩個相鄰的節(jié)點指向的從樹中的有效節(jié)點數(shù),小于一個從樹能夠 容納的節(jié)點數(shù);所述將主樹中的第一正整數(shù)個相鄰節(jié)點,及所述笫一正整數(shù)個節(jié)點分別 指向的從樹,合并為第二正整數(shù)個主樹節(jié)點,以及與所述第二正整數(shù)個主 樹節(jié)點指向的從樹具體為將所述主樹中,兩個相鄰節(jié)點中較大的主樹節(jié)點,及其指向的從樹中的 有效節(jié)點,插入所述兩個相鄰節(jié)點中較小的主樹節(jié)點指向的從樹中。
10、 一種基于樹形數(shù)據(jù)結(jié)構(gòu)節(jié)點的插入方法,其特征在于,包括 才艮據(jù)待插節(jié)點的關(guān)鍵碼值在主樹中查找最近主樹節(jié)點,所述最近主樹節(jié)點的關(guān)鍵碼值大于且最接近待插節(jié)點的關(guān)鍵碼值;所述主樹的根節(jié)點初始化 為具有最大的關(guān)鍵碼值;所述主樹中的左子節(jié)點大于父節(jié)點,父節(jié)點大于右 子節(jié)點;以最近主樹節(jié)點的外部指針指向的從樹作為當(dāng)前從樹,判斷當(dāng)前從樹是 否已滿,若是,則在當(dāng)前從樹中任意選擇一個節(jié)點作為拆分節(jié)點,將拆分節(jié)點插 入到主樹中作為新建主樹節(jié)點,為新建主樹節(jié)點分配新建從樹,并將新建主樹節(jié)點的外部指針指向新建從樹,將當(dāng)前從樹中位于拆分節(jié)點右側(cè)的全部節(jié)點搬移到新建從樹中,然后執(zhí)行查找最近主樹節(jié)點; 若否,則將待插節(jié)點插入到當(dāng)前從樹中。
11、 一種存儲裝置,其特征在于,包括 從樹存儲單元,用于存儲從樹;主樹存儲單元,用于存儲主樹,主樹中的節(jié)點具有指向從樹的外部指針。
12、 如權(quán)利要求ll所述的存儲裝置,其特征在于,所述存儲裝置還包括 查找單元,用于根據(jù)待插節(jié)點的關(guān)鍵碼值在主樹中查找最近主樹節(jié)點,所述最近主樹節(jié)點的關(guān)鍵碼值小于且最接近待插節(jié)點的關(guān)鍵碼值;所述主樹 的才艮節(jié)點初始化為具有最小的關(guān)鍵碼值;其中,所述主樹包括父節(jié)點、所述 父節(jié)點的左子節(jié)點和所述父節(jié)點的右子節(jié)點,且所述左子節(jié)點大于所述父節(jié) 點,所述父節(jié)點大于所述右子節(jié)點,判斷單元,用于以最近主樹節(jié)點的外部指針指向的從樹作為當(dāng)前從樹, 判斷當(dāng)前從樹是否已滿,搬移單元,若判斷單元判斷結(jié)果為是,則用于在當(dāng)前從樹中任意選擇一 個節(jié)點作為拆分節(jié)點,將拆分節(jié)點插入到主樹中作為新建主樹節(jié)點,為新建 主樹節(jié)點分配新建從樹,并將新建主樹節(jié)點的外部指針指向新建從樹,將當(dāng) 前從樹中位于拆分節(jié)點左側(cè)的全部節(jié)點搬移到新建從樹中,插入單元,若判斷單元判斷結(jié)果為是否,則用于將待插節(jié)點插入到當(dāng)前 從樹中;或者, 所述存儲裝置還包括第一查找單元,根據(jù)待查節(jié)點的關(guān)鍵碼值在主樹中查找待查節(jié)點,若主 樹中不存在上述待查節(jié)點,則查找最近主樹節(jié)點;所述最近主樹節(jié)點的關(guān)4建 碼值、于且最接近待插節(jié)點的關(guān)鍵碼值,待查節(jié)點查找單元,用于以所述最近主樹節(jié)點的外部指針指向的從樹作 為當(dāng)前從樹;在所述當(dāng)前從樹中查找所述待查找節(jié)點;或者,所述存儲裝置還包括第二查找單元,用于根據(jù)待刪節(jié)點的關(guān)鍵碼值在主樹中查找待刪節(jié)點,若主樹中不存在上述待刪節(jié)點,則查找最近主樹節(jié)點;所述最近主樹節(jié)點的 關(guān)鍵碼值'J 、于且最接近待刪節(jié)點的關(guān)鍵碼值,待刪節(jié)點查找單元,用于以最近主樹節(jié)點的外部指針指向的從樹作為當(dāng) 前從樹;在所述當(dāng)前從樹中查找所述待刪節(jié)點,刪除單元,刪除所述查找到的待刪節(jié)點;或者,所述存儲裝置還包括檢測單元,用于檢測所述主樹中是否存在主樹中的第 一正整數(shù)個相鄰的 節(jié)點指向的從樹中的有效節(jié)點數(shù),小于第二正整數(shù)個從樹能夠容納的節(jié)點數(shù), 且所述第一正整數(shù)大于第二正整數(shù),合并單元用于在檢測單元檢測結(jié)果為是時,將所述主樹中的第一正整 數(shù)個相鄰節(jié)點,及所述第一正整數(shù)個節(jié)點分別指向的從樹,合并為第二正 整數(shù)個主樹節(jié)點,以及與所述第二正整數(shù)個主樹節(jié)點指向的從樹。
13、 根據(jù)權(quán)利要求ll所述存儲裝置,其特征在于,還包括 查找單元,用于才艮據(jù)待插節(jié)點的關(guān)^l碼值在主樹中查找最近主樹節(jié)點,在搬移單元將當(dāng)前從樹中位于拆分節(jié)點右側(cè)的全部節(jié)點搬移到新建從樹中后 執(zhí)行查找最近主樹節(jié)點,所述最近主樹節(jié)點的關(guān)鍵碼值大于且最接近待插節(jié) 點的關(guān)鍵碼值;所述主樹的根節(jié)點初始化為具有最大的關(guān)鍵碼值,其中,所 述主樹包括父節(jié)點、所述父節(jié)點的左子節(jié)點和所述父節(jié)點的右子節(jié)點,且所 述左子節(jié)點大于所述父節(jié)點,所述父節(jié)點大于所述右子節(jié)點;判斷單元,用于以最近主樹節(jié)點的外部指針指向的從樹作為當(dāng)前,人樹, 判斷當(dāng)前從樹是否已滿,搬移單元,若判斷單元判斷結(jié)果為是,則用于在當(dāng)前從樹中任意選擇一 個節(jié)點作為拆分節(jié)點,將拆分節(jié)點插入到主樹中作為新建主樹節(jié)點,為新建 主樹節(jié)點分配新建從樹,并將新建主樹節(jié)點的外部指針指向新建從樹,將當(dāng) 前從樹中位于拆分節(jié)點右側(cè)的全部節(jié)點搬移到新建從樹中;插入單元,若判斷單元判斷結(jié)果為是否,則用于將待插節(jié)點插入到當(dāng)前 從樹中。
14、 一種通信設(shè)備,其特征在于,包括 權(quán)利要求11至13所述的存儲裝置中的任意一個。
全文摘要
本發(fā)明實施例公開了一種基于樹形數(shù)據(jù)結(jié)構(gòu)節(jié)點的插入的方法和存儲裝置。根據(jù)待插節(jié)點的關(guān)鍵碼值在主樹中查找最近主樹節(jié)點,所述最近主樹節(jié)點的關(guān)鍵碼值小于且最接近待插節(jié)點的關(guān)鍵碼值;以最近主樹節(jié)點的外部指針指向的從樹作為當(dāng)前從樹,判斷當(dāng)前從樹是否已滿,若是,則在當(dāng)前從樹中任意選擇一個節(jié)點作為拆分節(jié)點,將拆分節(jié)點插入到主樹中作為新建主樹節(jié)點,為新建主樹節(jié)點分配新建從樹,并將新建主樹節(jié)點的外部指針指向新建從樹,將當(dāng)前從樹中位于拆分節(jié)點左側(cè)的全部節(jié)點搬移到新建從樹中,然后執(zhí)行查找最近主樹節(jié)點,若否,則將待插節(jié)點插入到當(dāng)前從樹中。將樹形數(shù)據(jù)結(jié)構(gòu)的樹分成主樹和從樹降低了樹的高度,減少了節(jié)點插入的時間。
文檔編號G06F17/30GK101515298SQ20091013265
公開日2009年8月26日 申請日期2009年3月30日 優(yōu)先權(quán)日2009年3月30日
發(fā)明者毅 易, 杜文華, 洪榮峰 申請人:華為技術(shù)有限公司