左右值法二叉树遍历,多级分销系统,左右值关系链解决方案

今天遇到一个多级分类问题,层层分类下去,属于无限极分类。首先遇到这样的问题:

①如何确保查询的某个节点是否属于我的下级链中。

②新添加节点时整天会不会发生混乱。

③怎样高效得到答案,如果级数达到几W级呢?

④删除节点的影响。。。等等。


首先解决方案想到了几个:

1.根据传入的某个编号查询上级编号,直到最顶级,如果没有发现我的编号,证明不是我同一链接。

2.另外加一张表,专门存储同一链接属性的值,根据唯一属性对比,有则证明了血缘关系,否则是非亲非故的关系。

3.顺推法,也就是按照我的下级关系,获取所有的下级编号,然后对比传入编号是否在我的范围内,从而达到这种效果。

4.在新增节点时直接将上级的编号和自己的编号写入血缘关系字段,在新参数传入后对比我的参数是否在该血缘关系中,在则是我的下级,如果不在则表示非亲非故。

5.二叉树左右值法,也就是根据新增节点时对左右值操作,有传入的编号时对比我的左右值范围,如果在我范围内则表示是血缘关系,否则非亲非故~


经过多次考虑,我选择了最后一种,当然也同时做了第4种(作为备用),因为这种直接可以对比,效率极高。

下面我详细说说这个功能的实现:

首先抛出一张图(图都是我手画的,分析的时候画的,比较快,就是丑了点),入门先看图:


从编号开始到结束很容易发现 ,是从左到右的,左边的值和右边的值决定了谁属于该节点区块的下级。

逻辑思维:

1.如何判断某个节点是否属于我的下级呢?

2.左边的值和右边的值是怎么算的?

搞定这两个问题其实其他问题都很容易解决了。

下面看看我的图就懂了:


哈哈哈,是不是有些眉目了(左边递增,右边递减),其实就是这样算来的。我总结了上面的公式:

新节点:

左值 = 直接父类的右值

右值 = 直接父类的右值加1(也等于左值+1)

这样就可以在新增节点时确定其左右值了,可是 只要有节点的改动,都会影响整体的左右值,所以必须要知道其中的规律,以便节点改动时整体更新,保证数据链的可靠。

好了,我再上一张单链的图,这张比较好理解,每种符合框起来的是代表新增某节点后左右值对应改变值。


根据这张图已经知道规律了,也就是每次新增节点时都要更新上面的节点,确保血缘关系不断层。

下面我在上图中的一个位置又加一个节点,用圈圈代表新增节点对以前节点的影响:



好了,根据上面的图已经知道要怎么确保关联关系了。下面说说sql语句怎么写吧,只是分析一下逻辑:

①获取我的左右值 select left_id,right_id from user where .....

②获取某节点的层级 select ...... from user where left_id > (我的左值) and right_id < (我的右值) .....

③在某节点下新增一个节点 insert into user set left_id = (我的直接上级右值),right_id = (我的直接上级的右值+1) 

④新增节点后,批量更新受影响的左右值 

update user set  left_id = left_id + 2 where left_id >= (我的直接上级右值) and id <> (刚刚新增成功的编号);

update user set right_id = right_id + 2 where right_id >= (我的直接上级的右值) and id <> (刚刚新增成功的编号)。

注意:排除刚刚新增的节点的左右值!


删除节点其实一样的,主要是记得更新会受影响的节点:

我的公式:

删除的值 = 要删除节点的右值 - 要删除节点的左值 + 1;

要同步的左右值: 大于等于删除节点的左右值。

其实删除节点和新增节点是刚刚相反的,删除逆推一下即可,如图:



sql语句也是很简单的,我就不写了。

发现这个左右值逻辑非常好用,值得记录一下。



评论/留言