预排序遍历算法(MPTT)

预排序遍历算法(MPTT)

算法详细:

对于所有的树的节点,都会有一个左值和一个右值,用于确定该节点的边界。

父节点的左值都会比子节点左值的小,右值都会比子节点的右值大。

image-20201208174913963

  1. 没有父节点新增:即没有父节点新建一个节点,那么会生成一个左右值为1,2的节点。

    image-20201208175351441

  2. 有父节点新增:将当前节点左值赋值为父节点的右值,右值赋值为左节点+1。所有左值和右值比6大的都需要加上2。

    image-20201208180651338

  3. 删除没有子级的节点:所有节点的左右值大于当前节点的右值,那么都会减去2。

    image-20201208185742182

  4. 删除有子节点的节点:所有节点的左右值大于删除的顶级节点的右值,那么这些值都会减去删除节点的个数乘以2。可以发现和删除没有子级的节点可以归并为一种,所有左右值大于顶级的,那么会减去删除节点的个数乘以2。

    image-20201208190819977

  5. 当前节点(x,y)的子孙级:所有左值大于x,右值小于y的节点就是当前节点的子孙级。

  6. 当前节点(x,y)的祖先级:所有左值小于x,右值大于y的节点就是当前节点的子孙级。

  7. level字段的作用:上述方式很容易获取所有的子孙级和祖先级,但是如果只想获取一级或者两级的话就很难处理,所以添加level字段来过滤出相隔n级的子孙级和祖先级。

  8. root_id的作用:当有多个树的情况,用于标识这些节点属于哪棵树。

posted @ 2020-12-08 19:35  leevi-ding  阅读(1281)  评论(0)    收藏  举报