这样?
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.   

    这样?
    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)
      

  2.   

    每个主目录一个唯一的id
    移动到哪个目录下,加上目录id
      

  3.   

    对于树形结构,如果我要将一个主结点移至其下的一个分结点,那么实际的过程应当是
    1)判断目标结点是否是在所移动的结点之下。
    2)将主结点移至目标结点处,将其fid变为目标结点的cid。
    3)将所有有结点移动的下一级结点依次升一级。
        这个办法实际上是很通用了,除了结点将其自已放于自己之内的情况,他可以将两个过程统一起来,其上这个过程说起来是很容易的,但做起来就不是那么容易了,因为要遍历所有的结点(如果其某一分枝上有结点移动),如果有500个结点会怎么样?我用递归实现了树,也用fid变更实现了结点的转移,但我实现不了这个遍历,即使实现了,其效率如何也是未可知(已经用了一次递归了,那可是超过500个目录呀,我在本地都花了三秒钟才显示出来,不知道放到网上之后要多久,不敢想了)。在此仍然要感谢唠叨,shuiaaa(情海水) ,blueoxygen(有你在身旁 心更坚强) 的帮助,你们所讲的东西我都已经想到了,还望大家再思考思考。毕竟这是一个算法的问题,而不仅仅是一个逻辑问题。
      

  4.   

    苦想一天终于把问题搞定了,下面把我的办法帖出来供大家参考
    树形结构节点移动方案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
    {
    /* 简单移动 */
    }以上办法可以对目录的结点进行随意调整,在根目录的节点全部移走后,下一级会自动上升一级作为根目录,因此不会出现根目录丢失的情况。