用樹結構儲存資料

2021-07-23 14:15:57 字數 3235 閱讀 6512

insert into nested_category

values('electronics',1,20,0),('televisions',2,9,1),('tube',3,4,2),

('lcd',5,6,2),('plasma',7,8,2),('portable electronics',10,19,1),

('*** players',11,14,2),('flash',12,13,3),

('cd players',15,16,2),('2 way radios',17,18,2);

select * from nested_category

select * from nested_category where depth=0

select * from nested_category where lft>1 and rgt<24 and depth=1

select * from nested_category where lft>2 and rgt<9 and depth=2

select * from nested_category where lft>10 and rgt<13 and depth=2

select * from nested_category where lft>14 and rgt<23 and depth=2

--新增節點

declare @myright int=0

select @myright= rgt from nested_category

where name = 'televisions';--查詢要插入的葉子節點右面的兄弟節點的rgt值

update nested_category set rgt = rgt + 2 where rgt > @myright;

update nested_category set lft = lft + 2 where lft > @myright;

insert into nested_category(name, lft, rgt,depth) values('game consoles', @myright + 1, @myright + 2,1);

--為新加的 game consoles 節點新增子節點

declare @myleft int=0,@depth int=0

select @myleft= lft,@depth=depth from nested_category where name = 'game consoles';--查詢該節點的 lft 值

update nested_category set rgt = rgt + 2 where rgt > @myleft;--比他大的所有左節點加2

update nested_category set lft = lft + 2 where lft > @myleft;--比他大的所有右節點加2

insert into nested_category(name, lft, rgt,depth) values('game consoles', @myleft + 1, @myleft + 2,@depth+1);

--新增乙個樹結構

declare @myright int=0,@depth int=0

select @myright= rgt,@depth=depth from nested_category where name = 'game consoles';

update nested_category set rgt = rgt + 6 where rgt > @myright;

update nested_category set lft = lft + 6 where lft > @myright;

insert into nested_category(name, lft, rgt,depth) values ('china',@myright+1,@myright+6,@depth)--根節點

insert into nested_category(name, lft, rgt,depth) values ('beijing',@myright+2,@myright+3,@depth+1)--第乙個子節點

insert into nested_category(name, lft, rgt,depth) values ('shanghai',@myright+4,@myright+5,@depth+1)--第二個子節點

--連同子節點一起刪除

declare @myright int=0,@myleft int=0,@mywidth int=0

select @myleft = lft, @myright = rgt, @mywidth = rgt - lft + 1

from nested_category

where name = 'china';--查詢要刪除節點的左右值

delete from nested_category where lft between @myleft and @myright;

update nested_category set rgt = rgt - @mywidth where rgt > @myright;

update nested_category set lft = lft - @mywidth where lft > @myright;

--只刪除跟節點  把根節點下的所有的子節點都放到被刪除節點的根節點上

declare @myright int=0,@myleft int=0,@mywidth int=0

select @myleft = lft, @myright = rgt, @mywidth = rgt - lft + 1

from nested_category

where name = '*** players';--查詢要刪除節點的左右值

delete from nested_category where lft = @myleft;

update nested_category set rgt = rgt - 1, lft = lft - 1,depth=depth-1 where lft between @myleft and @myright;--修改子節點

update nested_category set rgt = rgt - 2 where rgt > @myright;

update nested_category set lft = lft - 2 where lft > @myright;

--刪除根節點,並把其子節點放到指定的跟節點中

--有待更新.......

用遞迴形成樹結構資料

定義乙個樹形實體 public class orgtrees public int id public int fatherid public string name public int lever public bool haschildren public string orgcode pub...

資料結構 樹結構

樹結構以一種 一對多 的資料關係。樹的結點 結點 樹結構的每乙個元素都可以被稱為乙個節點。父結點 a結點是b,c的父結點 子結點 b,c是a的子結點 根結點 a是樹的根結點,每乙個非空的樹結構中只有乙個根結點 q 如何判斷某個結點是否是根結點?a 根結點沒有父節點 葉子結點 d,e,f是葉子結點,葉...

獲取樹結構資料

public function getrolefields result self formatfileds hrmauthfuncfieldmaps,0 return result public function formatfileds hrmauthfuncfieldmaps,fatherid...