这样?
1.
----|E(5,1)
------|G(7,5)
--------|I(8,7)
----------|A(1,0)
----------|B(2,0)
----------|C(3,0)
----------|D(4,0)
------|H(8,5)
----|F(6,1)2.
--|A(1,0)
--------|I(8,7)
----------|E(5,1)
------------|G(7,5)
------------|H(8,5)
----------|F(6,1)
--|B(2,0)
--|C(3,0)
--|D(4,0)
1.
----|E(5,1)
------|G(7,5)
--------|I(8,7)
----------|A(1,0)
----------|B(2,0)
----------|C(3,0)
----------|D(4,0)
------|H(8,5)
----|F(6,1)2.
--|A(1,0)
--------|I(8,7)
----------|E(5,1)
------------|G(7,5)
------------|H(8,5)
----------|F(6,1)
--|B(2,0)
--|C(3,0)
--|D(4,0)
解决方案 »
- 模拟登录 提交不上帐号 密码就可以 请大神们帮解决一下
- 菜鸟请教post的问题
- 问大家一个dreamweaver+php+mysql问题
- 有关data validation 急! 急! 急!
- 新手求助:环境问题
- 这样的问题怎么解决?期待有过类似经验的大哥告诉我
- php中用header()传HTTP头到客户端,让客户端下载文件,IE中没有问题,firefox中却不行,求教各位
- 都是在windows下用gd库?有用linux做服务器的没?现在虚拟空间和服务器租用商都用windows系统?
- 菜鸟提问:<!-- -->是什么意思?能讲的具体点吗?谢了
- 请教一个关于网站登陆的问题,100分求救啊!
- 团队招收人员
- 关于URL传递函数的问题?快来帮帮我呀,很急!很急!一定给分!!!!
1.
----|E(5,1)
------|G(7,5)
--------|I(8,7)
----------|A(1,0)
----------|B(2,0)
----------|C(3,0)
----------|D(4,0)
------|H(8,5)
----|F(6,1)2.
--|A(1,0)
--------|I(8,7)
----------|E(5,1)
------------|G(7,5)
------------|H(8,5)
----------|F(6,1)
--|B(2,0)
--|C(3,0)
--|D(4,0)
移动到哪个目录下,加上目录id
1)判断目标结点是否是在所移动的结点之下。
2)将主结点移至目标结点处,将其fid变为目标结点的cid。
3)将所有有结点移动的下一级结点依次升一级。
这个办法实际上是很通用了,除了结点将其自已放于自己之内的情况,他可以将两个过程统一起来,其上这个过程说起来是很容易的,但做起来就不是那么容易了,因为要遍历所有的结点(如果其某一分枝上有结点移动),如果有500个结点会怎么样?我用递归实现了树,也用fid变更实现了结点的转移,但我实现不了这个遍历,即使实现了,其效率如何也是未可知(已经用了一次递归了,那可是超过500个目录呀,我在本地都花了三秒钟才显示出来,不知道放到网上之后要多久,不敢想了)。在此仍然要感谢唠叨,shuiaaa(情海水) ,blueoxygen(有你在身旁 心更坚强) 的帮助,你们所讲的东西我都已经想到了,还望大家再思考思考。毕竟这是一个算法的问题,而不仅仅是一个逻辑问题。
树形结构节点移动方案A(1,0)
--|D(4,1)
----|F(6,4)
------|G(7,6)
--|E(5,1)
B(2,0)
C(3,0)一:情况一当目标节点是其中某一节点的一个分枝节点时把ABC移到G点之下目标树形应当是--|D(4,0)
----|F(6,4)
------|G(7,6)
--------|A(1,7)
--------|B(2,7)
--------|C(3,7)
--|E(5,0)
要实现这样的树形结构变化需要如下的两个步骤。
第一步
A(1,0)<--缓存下所移动的节点的fid和cid。cid当然是一个数组了,我的办法是从表单中传过来,而不用数据查询。节省时间
$src_cid[$i] = &$src_dirs['0'];
$src_fid[$i] = &$src_dirs['1'];
在这里的src_dirs是从表单中传来的一个数组,它的第一个键是cid,第二个是fid--|D(4,1)
----|F(6,4)
------|G(7,6)<--此时应当缓存目标节点的父节点,在这里可以看到是6。
B(2,0)
C(3,0)第二步
--|D(4,0)<--非常关键的步骤是在这里,要将ABC的下一级上升一级,升级的办法很简单,就是将DE的fid变成ABC的fid
----|F(6,4)
------|G(7,6)
--------|A(1,7)<--将ABC的父节点变成目标cid
--------|B(2,7)
--------|C(3,7)
--|E(5,0)
至此树形结构完成。
二:情况二
当不是以上情况时,可以直接进行fid的对应更改其实最麻烦的不是上述的树形结构转化,而是对于情况的分析。什么情况用第一种转化,什么情况只需简单的fid变更。
我的办法用了一个函数
/** BEGIN function
*
* 作者:偶然
* 功能:判断目标栏目是否源目录的分枝
* 时间:2003.7.5
* 变量:
* 返回:fid 分枝的终极结点
* 示例:
*
*/
function checkisbelong($obj_id,$lang_type)
{
/* 因为目标只有一个,所以从目标处查找其fid */
$sql_belong = "select fid from category where cid='".$obj_id."' and lang_type='".$lang_type."'";
echo "<BR>$sql_belong";
$res_belong = mysql_query($sql_belong);
$arr_belong = mysql_fetch_array($res_belong);
$fid = $arr_belong['fid'];
if($fid!='0')
{
checkisbelong($fid,$lang_type);
}
Return $fid;
}这个返回的值非常重要,它将会作为情况判断的依据/* 检查目标是否是源的分枝,如果是执行复杂运算,如果不是,执行简单运算 */
$getfid = checkisbelong($obj_cid,$lang_type);$isbelong = '';
for($i=0; $i<count($src_cid); $i++)
{
if($src_cid[$i]==$getfid)
{
$isbelong=true;
}
else
{
$isbelong=false;
}
}
if($isbelong==true)
{
/* 复杂移动 */
}
else
{
/* 简单移动 */
}以上办法可以对目录的结点进行随意调整,在根目录的节点全部移走后,下一级会自动上升一级作为根目录,因此不会出现根目录丢失的情况。