交换兄弟节点数据

conannb 2008-02-15 04:37:49

名称 左 右 (左右值代表遍历树节点顺序,假设一只虫完整爬完这棵树:)见下图)
手机 1 14
NOKIA 2 7
MOTO 8 13
5300 3 4
N73 5 6
V3 9 10
L7 11 12
树结构
手机
1 | 14
---------
| |
NOKIA MOTO
2 | 7 8 | 13
--------- ---------
| | | |
5300 N73 V3 L7
3 4 5 6 9 10 11 12
问题:
交换NOKIA MOTO兄弟节点位置(其子节点也随之移动,但是相对位置不变,如交换后,5300 左右值为 9 10 N73 左右值为 11 12) ,这样一个Update语句怎么写
...全文
409 22 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
conannb 2008-02-18
  • 打赏
  • 举报
回复
乖乖 这样也行 用负数 结贴
JiangHongTao 2008-02-18
  • 打赏
  • 举报
回复
恩,欠考虑呀,惭愧、惭愧!!!
修改一下:
update t set left=@rl-@rr-1-left,right=@rl-@rr-1-right where left between @ll and @lr
update t set left=@lr-@ll+1-left,right=@lr-@ll+1-right where left between @rl and @rr
update t set left = 0-left,right=0-right where left <0
conannb 2008-02-18
  • 打赏
  • 举报
回复
L 子树的 left right 就和 R 子树的left right 部分值相同了
Ps:结贴分肯定会给你的 呵呵
conannb 2008-02-18
  • 打赏
  • 举报
回复
执行了
update t set left=left+@rr-@rl+1,right=right+@rr-@rl+1 where left between @ll and @lr

后,L 子树的 left right 就和 R 子树的left right 值相同了,下面再执行
update t set left=left-@lr+@ll-1,right=right-@lr+@ll-1 where left between @rl and @rr
是不是有些问题?
JiangHongTao 2008-02-18
  • 打赏
  • 举报
回复
LZ 加分结贴吧
JiangHongTao 2008-02-18
  • 打赏
  • 举报
回复
加一条判断。
if @rl-@lr<> 1
print '不是左右兄弟节点'
JiangHongTao 2008-02-18
  • 打赏
  • 举报
回复
t为表名,@l,@r 为需要交换的左右节点。
declare @ll int,@lr int,@rl int @rr int
declare @l varchar(100),@r varchar(100)
select @l='NOKIA',@r ='MOTO'
select @ll = left,@lr=right from t where 名称=@l
select @rl = left,@rr=right from t where 名称=@r
update t set left=left+@rr-@rl+1,right=right+@rr-@rl+1 where left between @ll and @lr
update t set left=left-@lr+@ll-1,right=right-@lr+@ll-1 where left between @rl and @rr


JiangHongTao 2008-02-18
  • 打赏
  • 举报
回复
先计算出LC和LR放在变量中呀
conannb 2008-02-18
  • 打赏
  • 举报
回复
如何同步更新 L R 节点呢?更新了L 节点 ,数值就变了 ,R 节点怎么办?
rouqu 2008-02-18
  • 打赏
  • 举报
回复
为什么要交换哩 重新编号不行吗
JiangHongTao 2008-02-18
  • 打赏
  • 举报
回复
4L 的更好。
LC = L.right-L.left+1
LR = R.right-R.left+1
JiangHongTao 2008-02-18
  • 打赏
  • 举报
回复
上面的漏写了。
思路:假设需要交换的节点分别为:L和R
1、求出L节点的所有子节点(含自身)的个数为LC,并设LC = 2*LC
2、求出R节点的所有子节点(含自身)的个数为LR,并设LR = 2*LR
3、更新L节点的所有子节点(含自身)的left=left+LR,right=right+LR
4、更新R节点的所有子节点(含自身)的left=left-LC,right=right-LC
5、结束。
JiangHongTao 2008-02-18
  • 打赏
  • 举报
回复
思路:假设需要交换的节点分别为:L和R
1、求出L节点的所有子节点(含自身)的个数为LC,并设LC = 2*LC
2、更新L节点的所有子节点(含自身)的left = left +LC,right=right+LC
3、更新R节点的所有子节点(含自身)的left=left-LC,right=right-LC
4、结束。
conannb 2008-02-18
  • 打赏
  • 举报
回复
up
conannb 2008-02-16
  • 打赏
  • 举报
回复
up
conannb 2008-02-15
  • 打赏
  • 举报
回复
左子树所有的left right 均 +dec
右子树所有的left right 均 -inc
conannb 2008-02-15
  • 打赏
  • 举报
回复
左子树所有的left right 均 +dec
右子树所有的left right 均 -inc
conannb 2008-02-15
  • 打赏
  • 举报
回复
错了 是
左子树所有的left right 均 +dec
右子树所有的left right 均 -inc

conannb 2008-02-15
  • 打赏
  • 举报
回复
左右子树不是有数量关系的吗?
设inc为nokia.right-nokia.left + 1
dec为moto.right-moto.left + 1
左子树所有的left right 均 +inc
右子树所有的left right 均 -dec
昵称被占用了 2008-02-15
  • 打赏
  • 举报
回复
很麻烦的,
逻辑上应该先删除再添加,而且会影响其他节点的编号的

加载更多回复(2)

34,838

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧