预排序遍历树算法
更新操作:先讲述笔者那时候的思路
笔者最初的方法是:伪删除后伪插入
先更新该节点为根整个树以外的节点左右值数据(笔者称之伪删除)
再更新该节点为根整个树左右值数据(笔者称之伪插入)
但是很快笔者就发现这样思路是有BUG的。
前一步修改的数据可能会进入下一步的更新条件判断里。
笔者觉得是顺序的问题,换了顺序
先更新该节点为根整个树左右值数据
再更新该节点为根整个树以外的节点左右值数据
然而还是一样的BUG,前一步修改的数据可能会进入下一步的更新条件判断里。
这个问题就是更新该节点为根整个树如何与除此以外的数据分割开?
笔者同事提供的思路是:临时表。
就如 两变量交换,temp= a;a=b;b=temp;思路一样,就是要找一个空的杯子存在临时的数据。
临时表是一种解决的办法:
DROP TABLE IF EXISTS T_DIR_TEMP;
CREATE TABLE T_DIR_TEMP(
ID VARCHAR(32) NOT NULL UNIQUE,
V_NAME VARCHAR(50) NOT NULL UNIQUE,
V_PID VARCHAR(32),
N_LEFT BIGINT NOT NULL,
N_RIGHT BIGINT NOT NULL
);
0) 先判断文件夹是否有移动,即父目录是否与原先一致
1)清空临时表,确保里面没有数据影响操作。
DELETE FROM T_DIR_TEMP;
2) 获取该结点的左右值
临时变量temp_left=该节点的左值;
临时变量temp_right=该节点的右值;
临时变量temp_num= temp_right-temp_left+1
3) 拷贝数据到临时表
INSERT INTO T_DIR_TEMP
SELECT *
FROM T_DIR D
WHERE D.N_LEFT >= temp_left
AND D.N_RIGHT <= temp_right;
4)删除该节点为根整个树
DELETE FROM T_ARCHIVE_DIRECTORY
WHERE N_LEFT >= temp_left
AND N_RIGHT <= temp_right;
5)更新临时表数据信息
临时变量temp_p_right =SELECT N_RIGHT FROM T_DIR WHERE ID = pid;
临时变量temp_sub= 新父目录的右值temp_p_right- 该节点的右值temp_right
UPDATE T_ARCHIVE_DIRECTORY_TEMP
SET N_LEFT = N_LEFT - temp_sub,N_RIGHT = N_RIGHT -temp_sub
WHERE N_LEFT >= temp_left
AND N_RIGHT <= temp_right;
6) 拷贝临时表里数据到目录表
INSERT INTOT_DIR
SELECT *
FROM T_DIR_TEMP
7)清空临时表
DELETE FROM T_DIR_TEMP;