最近做一个程序,用到树形结构,并且要存储到数据库中。于是研究了一下树形结构的左右值存储。
左右值虽然取父祖节点和子孙节点,查找节点路径非常方便,但要找某节点的父节点,子节点和兄弟节点就比较困难,所以还要需要一个层级维度方便确定父子和兄弟节点,也就是树形结构中所说的树的深度。
下面列举一些普通的左右值算法,网上有大量的资料,就不细说了。
以下资料来自网上,错误的地方我已纠正
一、计算某节点的子孙节点数。
子孙节点数量 = (节点右值-节点左值-1)/2
二、查找某节点的所有子孙节点。
select * from tree where L > 节点左值 and R
三、查找某节点的所有父祖节点。
select * from tree where L 节点右值 order by L desc;
四、某节点所处层级。
select count(*) from tree where L <= 节点左值 and R >= 节点右值
五、增加节点。需要为要增加的节点腾出左右值的空间。然后将新节点插入数据库。在哪里增加?这就需要参照物,有下面四种情况。
1.在A节点下增加子节点B,B作为第一个子节点。
#更新受影响节点
update tree set L = L + 2 where L > A节点左值;
update tree set R = R + 2 where R > A节点左值;
#插入新增的节点
insert into tree (name, L, R) values('B', A节点左值+1, A节点左值+2);
2.在A节点下增加子节点B,B作为最后一个子节点。
#更新受影响节点
update tree set L = L + 2 where L >= A节点右值;
update tree set R = R + 2 where R >= A节点右值;
#插入新增的节点
insert into tree (name, L, R) values('B', A节点右值, A节点右值+1);
3.在A节点后面增加节点B, B作为A的兄弟节点。
#更新受影响节点
update tree set L = L + 2 where L > A节点右值;
update tree set R = R + 2 where R > A节点右值;
#插入新增的节点
insert into tree (name, L, R) values('B', A节