預排序遍歷演算法(MPTT)
阿新 • • 發佈:2020-12-08
預排序遍歷演算法(MPTT)
演算法詳細:
對於所有的樹的節點,都會有一個左值和一個右值,用於確定該節點的邊界。
父節點的左值都會比子節點左值的小,右值都會比子節點的右值大。
-
沒有父節點新增:即沒有父節點新建一個節點,那麼會生成一個左右值為1,2的節點。
-
有父節點新增:將當前節點左值賦值為父節點的右值,右值賦值為左節點+1。所有左值和右值比6大的都需要加上2。
-
刪除沒有子級的節點:所有節點的左右值大於當前節點的右值,那麼都會減去2。
-
刪除有子節點的節點:所有節點的左右值大於刪除的頂級節點的右值,那麼這些值都會減去刪除節點的個數乘以2。可以發現和
刪除沒有子級的節點
可以歸併為一種,所有左右值大於頂級的,那麼會減去刪除節點的個數乘以2。 -
當前節點(x,y)的子孫級:所有
左值大於x,右值小於y
的節點就是當前節點的子孫級。 -
當前節點(x,y)的祖先級:所有
左值小於x,右值大於y
的節點就是當前節點的子孫級。 -
level欄位的作用:上述方式很容易獲取所有的子孫級和祖先級,但是如果只想獲取一級或者兩級的話就很難處理,所以新增level欄位來過濾出相隔n級的子孫級和祖先級。
-
root_id的作用:當有多個樹的情況,用於標識這些節點屬於哪棵樹。