日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

java中的左值右值_利用左值右值实现树状结构

發(fā)布時間:2024/9/19 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java中的左值右值_利用左值右值实现树状结构 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

image.png

1. 查詢

1.1. 得到節(jié)點 Node 下的所有節(jié)點,并按樹狀排序

SELECT * FROM tree WHERE lft BETWEEN Node.Lft AND Node.Rgt ORDER BY lft ASC;

1.2. 得到節(jié)點 Node 的路徑:

SELECT * FROM tree WHERE lft < Node.Lft AND rgt > Node.Rgt ORDER BY lft ASC;

1.3. 節(jié)點 Node 的子節(jié)點總數

(Node.Rgt-Node.Lft-1)/2

2. 修改

2.1. 增加一個節(jié)點

假設新節(jié)點的父節(jié)點是 Father,如果,這是它的第一個子節(jié)點,

nCurrent = Father.Lft;

否則,假設插入點的前一個兄弟為 Brother,

nCurrent = Brother.Rgt;

改變所有位于新節(jié)點右側的數值:

UPDATE tree SET rgt = rgt+2 WHERE rgt > nCurrent;

UPDATE tree SET lft = lft+2 WHERE lft > nCurrent;

這樣就為新插入的節(jié)點騰出了空間:

INSERT INTO tree(lft, rgt) VALUES(nCurrent+1, nCurrent+2);

2.2. 刪除一個節(jié)點 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. 子樹 SubTree 從 Father1 遷移至 Father2

相當于先插入子樹,再刪掉原來的子樹。

子樹根的左右值:

nSubTreeLeft = SubTree.Lft;

nSubTreeRight = SubTree.Rgt;

子樹上所有的節(jié)點數(包括子樹的根):

nSubTreeNodeNum = (nSubTreeRight - nSubTreeLeft - 1) / 2 + 1;

如果,這是 Father2 的第一個子節(jié)點,

nCurrent = Father2.Lft;

否則,假設插入點的前一個兄弟為 Brother,

nCurrent = Brother.Rgt;

騰子樹空間:

UPDATE tree SET lft=lft + 2* nSubTreeNodeNum WHERE lft > nCurrent; UPDATE tree SET rgt=rgt + 2* nSubTreeNodeNum WHERE rgt > nCurrent;

移動子樹:

UPDATE tree SET lft = lft + nCurrent + 1 - nSubTreeLeft, rgt = rgt + nCurrent + 1 - nSubTreeLeft WHERE lft BETWEEN nSubTreeLeft AND nSubTreeRight;

刪掉原來子樹占的空間:

UPDATE tree SET lft=lft -2* nSubTreeNodeNum WHERE lft > nSubTreeRight;

UPDATE tree SET rgt=rgt -2* nSubTreeNodeNum WHERE rgt > nSubTreeRight;

重構左右值

假設表結構類似:

image.png

/**

* 重構左右值

*

* @param rootId 根節(jié)點id

* @param left 左值開始值

* @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位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的java中的左值右值_利用左值右值实现树状结构的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。