应用
某个节点到底有多少子孙节点?
子孙总数
=(父节点的右值 - 父节点的左值 -1 ) /2
以节点 “ 食品 ” 举例,其子孙总数=( 11-2-1 ) / 2 = 4
如何判断某一节点下有没有子节点?
当该节点左值-1等于其右值时,其下没有子节点。
检索某一父节点的所有子节点?
假定我们要 对节点“食品”及其子孙节点进行先序遍历 的列表,只需使用如下一条 sql 语句:
SELECT * FROM `tree` WHERE `left_node` BETWEEN 2 AND 11 ORDER BY `left_node` ASC
如何取得父类?
SELECT * FROM `tree` WHERE `left_node`<$left_node AND `right_node`>$right_node
检索之后如何列表?
当左值 +1== 右值时,该节点没有子节点,则下一节点不为其子节点
若下一节点的左值 == 上一节点右值 +1 ,则 2 个节点是同级关系
若下一节点的左值 == 上一节点的左值 +1 时,则第 2 个节点应是第一个节点的子节点
若下一节点的左值 - 上一节点的右值 >1 时,则下一节点比上一节点高
(下一节点的左值 - 上一节点的右值)
级
在某一父节点下添加一个子节点?
1. 要求该子节点为该父节点下排序第一的节点,则$left_node =父节点left_node+1, $right_node = $left_node+1;
2. 要求该节点位于父节点下一个子节点A后面,则$left_node = 节点A的right_node+1, $right_node = $left_node+1;
3. 要求该节点是位于父节点下排序最后一位的节点,则$left_node =父节点right_node, $right_node = $left_node+1;
Sql:
UPDATE `tree` SET `right_node`=`right_node`+2 WHERE `right_node`>=$left_node
UPDATE `tree` SET `left_node`=`left_node`+2 WHERE `left_node`>=$left_node
INSERT INTO `tree` (`name` , `left_node` , `right_node`) VALUES
(`名字` , $left_node , $right_node)
移动节点,包括其子节点至节点A下?
设该节点左值$left_node ,右值$right_node
其子节点的数目为$count = ($right_node - $left_node -1 )/2 ,节点A左值为$A_left_node ,
UPDATE `tree` SET `right_node`=`right_node`-$right_node-$left_node-1 WHERE `right_node`>$right_node AND `right_node`<$A_left_node
UPDATE `tree` SET `left_node`=`left_node`-$right_node-$left_node-1 WHERE `left_node`>$right_node AND `left_node`<=$A_left_node
UPDATE `tree` SET `left_node`=`left_node`+$A_left_node-$right_node , `right_node`=`right_node`+$A_left_node-$right_node WHERE `left_node`>=$left_node
AND `right_node`<=$right_node
删除所有子节点?
DELETE FROM `tree` WHERE `left_node`>父节点的左值 AND `right_node`>父节点的右值
删除一个节点及其子节点?
在上例中的<号>号后面各加一个=号