使用左右值编码来存储无限分级树形结构 (三) -- 应用篇

本文详细介绍了树状数据结构中节点的操作方法,包括查询节点的子孙数量、判断节点是否有子节点、检索父节点及所有子节点等,并提供了具体的SQL语句实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


应用
某个节点到底有多少子孙节点?
子孙总数
=(父节点的右值 -父节点的左值-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 = 节点Aright_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`>父节点的右值


删除一个节点及其子节点?
在上例中的<>号后面各加一个=
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值