树形结构结点编码规则

  1. 任何一棵树都可以用一棵唯一的二叉树来表示,如:
    这里写图片描述
    转换规则是:树的根结点转换成二叉树的根结点,树的第一个孩子结点转换成根结点的左孩子,除第一个孩子结点外其余的孩子结点转换成转换成左孩子结点的右孩子(右子孙)。然后对除根结点外其余结点所表示的树也做上面的转换。

  2. 如果对一棵满二叉树的各个结点从1开始自上而下,自左而右开始编号,
    这里写图片描述
    那么编号为i的结点,其左孩子的编号为:2i,右孩子的编号为:2i+1,双亲结点的编号为:i/2。这个规律可以从上图看出来并用归纳法证明。

  3. 在二叉树上得到的结点编号,就是这棵二叉树所表示的树的各个结点的编号。如图
    这里写图片描述
    所不同的是,孩子结点和双亲结点的计算公式。在树结构中,一个编号为n的结点,其第i(i=1,2,3……)个孩子结点的编号为:(2^i)*n+2^(i-1)-1。而从编号为n的结点得到其双亲结点编号的算法是,如果n是偶数,则其双亲结点编号为:n/2;否则反复进行n=n/2 的操作,直到n为偶数为止。再把n=n/2就得到双亲结点的编号。

  4. 由上面所说的编码方法,对一棵树从1开始,自上而下,自左而右进行编号的话,就可以从任一结点的编号计算出其双亲结点,所有祖先结点,兄弟结点,孩子结点的编号。

  5. 实际实现这些操作可参考:https://download.csdn.net/download/yaojf1/10574023。附件里提供了编码接口,以及根据当前编码计算其它结点的接口。编码是64进制数,用java语言实现。对存取在mysql数据库的树形结构应该有帮助。需要注意的是数据库里存储编码的字段,排序规则必须是大小写敏感的。

猜你喜欢

转载自blog.csdn.net/yaojf1/article/details/81317749