应用某个节点到底有多少子孙节点?
子孙总数
=(父节点的右值 -父节点的左值-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`>父节点的右值
删除一个节点及其子节点?
在上例中的<号>号后面各加一个=号