如下图,如何删除树节点及所有子节点,子节点可能还有子节点,如何递归?
如果删除渭南就直接删除,删除西安就必须删除西安,钟楼,大雁塔|---陕西
|    | 
|    |---渭南 
|    | 
|    |--- 西安
|          | 
|          |--钟楼 
|          | 
|          |--大雁塔 

|---云南 
|    | 
|    |---丽江  数据库表示
 一个parent字段表示这个节点的父节点 
   id    parentid
 陕西     0
 渭南    陕西 
 西安    陕西
 钟楼    西安
 大雁塔  西安 
 云南    0 
 丽江    云南

解决方案 »

  1.   

    先删除数据库里的数据 然后重新生成树 一条sql语句应该可以把一个父结点下的子节点删除
      

  2.   

    public void deleteNode(Node node)
    {
      if(!node.hasSonNodes)
      { 
        session.delete(node);
      }
      else
      {
        Node[] SonNodes=node.getSonNodes();
        for(int i=0,i<SonNodes.length,i++)
        {
          deleteNode(SonNodes[i]);
        }
      }
    }
      

  3.   

    以上我写的半java,半伪代码,思路基本上就是这样了
      

  4.   

    更正:
    public void deleteNode(Node node)
    {
      session.delete(node);  //数据库中删除当前node这个节点
      if(node.hasSonNodes)   //当前节点是否有子节点
      {
        Node[] SonNodes=node.getSonNodes(); //获得当前node的所有子节点
        for(int i=0;<SonNodes.length;i++)    
        {
          deleteNode(SonNodes[i]);
        }
      }
    }
      

  5.   

    我写的,大家帮帮看有错误没?public class DeleteScheduleAction extends BaseAction
    {
      ActivityService as =(ActivityService)getActivityService() ;
      
    public ActionForward actionExecute(ActionMapping actionMapping,
    ActionForm actionForm, HttpServletRequest request,
    HttpServletResponse response) throws Exception
    {
         
          long activityId = Long.parseLong(request.getParameter("flag"));
        
          List lastList = new ArrayList();
          
         lastList= getId(activityId);
         
         lastList.add(new Long(activityId)); // last add the first point

          
        for(int i=0;i<lastList.size();i++)  
        {
         as.deleteActivity(((Long) lastList.get(i)).longValue());
        }
      
           return actionMapping.findForward("sccuess");
    }

          private List getId(long activityId) throws Exception
          {
          
           List idList = new ArrayList();
           idList=as.selectId(activityId); 
       //find if has next point 
       //(select activity_id from t_activity where parent_id =activityId)
           
           
           if(idList != null)
           {
           for(int i =0;i<idList.size();i++)
          
                {
               idList.add(getId(((Long) idList.get(i)).longValue())); 
                 
                }
          
            return idList;
           }
           else
           {
          
           return idList;
           }
           
           
          }
    }
      

  6.   

    晕,你逻辑都写到action里面了
    为什么不分开来写呢?这样很乱的
      

  7.   

    你这个思想对的,
    不过你这样子性能会降低一倍,因为多了一次循环删除
    为什么不在找到的时候就删除呢?而要保存下来
    还有看看这里idList.add(getId(((Long) idList.get(i)).longValue有没有错了
    没有的话应该就差不多
      

  8.   

    private void deleteById(long activityId) throws Exception
          {
          
           List idList = new ArrayList();
           idList=as.selectId(activityId); 
           as.deleteActivity(activityId);
           
           if(idList != null)
           {
                for(long i =0;i<idList.size();i++)
          
                {
               deleteById(i);         
                }  
           }  
          }