刪除樹形表中的乙個節點以及它的所有子孫節點

2021-08-31 11:12:16 字數 1760 閱讀 4517

有一張模擬多叉樹的表tree的結構如下(表中不含有外來鍵,即parent並不是指向自己id的外來鍵):

fieldtypenullkey

id                      int(11)            no                     pri

name                varchar(30)    yes                   

parent              int(11)            yes

type_isleaf       int(11)             yes

最頂層的父節點的parent預設為0,如果現在給你任意一條表中的記錄,也就相當於樹上的乙個節點,讓你刪除該節點以及它所有的子孫節點。

我想一般的方法會是採用遞迴,從這個節點開始,先找到這個節點的所有子節點放入乙個list中,然後再對list中的每個節點進行遞迴查詢到每個節點的子節點,均可以加入此list,直到遞迴到最下面的葉子層的節點,然後刪除list中的所有節點,不過個人感覺遞迴首先第乙個問題就是效率比較低。

我一般使用的方法是先直接將該節點刪除,然後迴圈刪除parent在表中找不到對應的父節點id的所有記錄,直到執行刪除語句時0 rows affected,說明該節點的所有子孫節點已經全部刪除了。可以使用如下的資料庫偽碼表示:

如果給你的節點的id是8(**使用jdbc硬編碼來說明吧,如果使用一些持久層框架的話,可能**要簡單不少)

//刪除該指定的節點 

preparedstatement pstmt=conn.preparestatement("delete from tree where id =8");

pstmt.executeupdate() ;

//找出父節點已經不存在的節點,說明被查詢出的是剛剛被刪除的節點的子節點

pstmt=conn.preparestatement("select id from tree where parent not in (select id from tree)");

//如果這句查詢執行有結果,說明被刪除的節點有直接子節點在表中,應該將標誌位置為false

resultset=pstmt.executequery();

boolean tag=false;

if(resultset.next())

tag=true;

while(tag)

pstmt=conn.preparestatement("select id from tree where parent not in (select id from tree)");

//如果這句查詢執行有結果,說明被刪除的節點有直接子節點在表中,應該將標誌位置為false

resultset=pstmt.executequery();

if(resultset.next())

tag=true;

}

由於mysql不支援"delete from tree where parent not in(select id from tree)" 這條語句的執行,所以複雜了許多,不然直接可以

while(getaffectedrows("delete from tree where parent not in(select id from tree)" "))  ,使用這一句即可.    ----- getaffectedrows()表示受影響的記錄行數。

鍊錶中新增乙個節點和刪除乙個節點

這裡主要記錄單向列表新增和刪除乙個指定位置節點的書寫方法。首先先建立鍊錶節點資料的基本型別 ifndef node h define node h include person.h class node endif node h 接下來建立節點的節本型別 class list endif 往指定節點...

遞迴刪除乙個節點以及該節點下的所有節點示例

有的時候刪除資訊的時候,需要把這條資訊下的所有的都刪除,這個時候就需要遞迴刪除了。下面是我在做部門管理中的刪除部門功能的時候寫的一段遞迴刪除乙個部門以及它的所有子部門的一段 僅供大家參考和自己以後備用。下面是我的一段 的展示 複製 如下 修改一條部門資訊 function del bumen id ...

刪除鍊錶中的乙個節點002單引數

237請編寫乙個函式,使其可以刪除某個鍊錶中給定的 非末尾 節點。傳入函式的唯一引數為 要被刪除的節點 現有乙個鍊錶 head 4,5,1,9 它可以表示為 鍊錶,函式引數只有乙個待刪節點 刪除節點,都是前乙個節點指向當前節點的後乙個節點,這個題的引數只有當前節點,並沒有煉表頭節點,不是兩個引數 所...