1. 程式人生 > 實用技巧 >預排序遍歷演算法(MPTT)

預排序遍歷演算法(MPTT)

預排序遍歷演算法(MPTT)

演算法詳細:

對於所有的樹的節點,都會有一個左值和一個右值,用於確定該節點的邊界。

父節點的左值都會比子節點左值的小,右值都會比子節點的右值大。

  1. 沒有父節點新增:即沒有父節點新建一個節點,那麼會生成一個左右值為1,2的節點。

  2. 有父節點新增:將當前節點左值賦值為父節點的右值,右值賦值為左節點+1。所有左值和右值比6大的都需要加上2。

  3. 刪除沒有子級的節點:所有節點的左右值大於當前節點的右值,那麼都會減去2。

  4. 刪除有子節點的節點:所有節點的左右值大於刪除的頂級節點的右值,那麼這些值都會減去刪除節點的個數乘以2。可以發現和刪除沒有子級的節點可以歸併為一種,所有左右值大於頂級的,那麼會減去刪除節點的個數乘以2。

  5. 當前節點(x,y)的子孫級:所有左值大於x,右值小於y的節點就是當前節點的子孫級。

  6. 當前節點(x,y)的祖先級:所有左值小於x,右值大於y的節點就是當前節點的子孫級。

  7. level欄位的作用:上述方式很容易獲取所有的子孫級和祖先級,但是如果只想獲取一級或者兩級的話就很難處理,所以新增level欄位來過濾出相隔n級的子孫級和祖先級。

  8. root_id的作用:當有多個樹的情況,用於標識這些節點屬於哪棵樹。