java中的左值右值_利用左值右值实现树状结构
image.png
1. 查詢
1.1. 得到節(jié)點(diǎn) Node 下的所有節(jié)點(diǎn),并按樹(shù)狀排序
SELECT * FROM tree WHERE lft BETWEEN Node.Lft AND Node.Rgt ORDER BY lft ASC;
1.2. 得到節(jié)點(diǎn) Node 的路徑:
SELECT * FROM tree WHERE lft < Node.Lft AND rgt > Node.Rgt ORDER BY lft ASC;
1.3. 節(jié)點(diǎn) Node 的子節(jié)點(diǎn)總數(shù)
(Node.Rgt-Node.Lft-1)/2
2. 修改
2.1. 增加一個(gè)節(jié)點(diǎn)
假設(shè)新節(jié)點(diǎn)的父節(jié)點(diǎn)是 Father,如果,這是它的第一個(gè)子節(jié)點(diǎn),
nCurrent = Father.Lft;
否則,假設(shè)插入點(diǎn)的前一個(gè)兄弟為 Brother,
nCurrent = Brother.Rgt;
改變所有位于新節(jié)點(diǎn)右側(cè)的數(shù)值:
UPDATE tree SET rgt = rgt+2 WHERE rgt > nCurrent;
UPDATE tree SET lft = lft+2 WHERE lft > nCurrent;
這樣就為新插入的節(jié)點(diǎn)騰出了空間:
INSERT INTO tree(lft, rgt) VALUES(nCurrent+1, nCurrent+2);
2.2. 刪除一個(gè)節(jié)點(diǎn) Node
DELETE Node;
UPDATE tree SET rgt = rgt - 2 WHERE rgt > Node.rgt;
UPDATE tree SET lft = lft - 2 WHERE lft > Node.rgt;
2.3. 子樹(shù) SubTree 從 Father1 遷移至 Father2
相當(dāng)于先插入子樹(shù),再刪掉原來(lái)的子樹(shù)。
子樹(shù)根的左右值:
nSubTreeLeft = SubTree.Lft;
nSubTreeRight = SubTree.Rgt;
子樹(shù)上所有的節(jié)點(diǎn)數(shù)(包括子樹(shù)的根):
nSubTreeNodeNum = (nSubTreeRight - nSubTreeLeft - 1) / 2 + 1;
如果,這是 Father2 的第一個(gè)子節(jié)點(diǎn),
nCurrent = Father2.Lft;
否則,假設(shè)插入點(diǎn)的前一個(gè)兄弟為 Brother,
nCurrent = Brother.Rgt;
騰子樹(shù)空間:
UPDATE tree SET lft=lft + 2* nSubTreeNodeNum WHERE lft > nCurrent; UPDATE tree SET rgt=rgt + 2* nSubTreeNodeNum WHERE rgt > nCurrent;
移動(dòng)子樹(shù):
UPDATE tree SET lft = lft + nCurrent + 1 - nSubTreeLeft, rgt = rgt + nCurrent + 1 - nSubTreeLeft WHERE lft BETWEEN nSubTreeLeft AND nSubTreeRight;
刪掉原來(lái)子樹(shù)占的空間:
UPDATE tree SET lft=lft -2* nSubTreeNodeNum WHERE lft > nSubTreeRight;
UPDATE tree SET rgt=rgt -2* nSubTreeNodeNum WHERE rgt > nSubTreeRight;
重構(gòu)左右值
假設(shè)表結(jié)構(gòu)類似:
image.png
/**
* 重構(gòu)左右值
*
* @param rootId 根節(jié)點(diǎn)id
* @param left 左值開(kāi)始值
* @return
*/
public int rebuildTree(int rootId, int left) {
int right = left + 1;
List categories = categoryMapper.selectByParentCategoryID(rootId);
for (Category category : categories) {
right = rebuildTree(category.getId(), right);
}
Category category = categoryMapper.selectByPrimaryKey(rootId);
category.setLft(left);
category.setRgt(right);
categoryMapper.updateByPrimaryKey(category);
return right + 1;
}
與50位技術(shù)專家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的java中的左值右值_利用左值右值实现树状结构的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 不动产登记他项权证(不动产登记证明和不动
- 下一篇: excel导入mysql语句_求助:用S