• 简洁常用权限系统的设计与实现(三):维护和利用节点的深度level,迭代实现树的构造


    如果在节点的属性中,增加一个level属性,即树的深度,构造树会非常容易。前提是,增加和修改节点的时候,要维护level。

       根节点的level为1,下一级为2,以此类推。

      构造树的方法,主要有2个:

       // 按照level排序,根节点在上,子结点在下

    public static List<Map<String, Object>> buildTree(List<TreeNode> list) {
    
    List<Map<String, Object>> rootList = new ArrayList<Map<String, Object>>();
    
    Map<String, Map<String, Object>> rootMap = new HashMap<String, Map<String, Object>>();
    
    for (TreeNode node : list) {
    
    Integer acl = node.getAcl();
    
    Integer parentAcl = node.getParentAcl();
    
    Map<String, Object> newNode = createNode(acl);
    
    rootMap.put(acl + "", newNode);
    
    if (parentAcl.equals(-1)) {
    
    rootList.add(newNode);
    
    } else {
    
    Map<String, Object> fatherNode = rootMap.get(parentAcl + "");
    
    addChild(fatherNode, newNode);
    
    }
    
    }
    
    return rootList;
    
    }
    
    
    
    private static void addChild(Map<String, Object> father,
    
    Map<String, Object> child) {
    
    //如果father=null,一定是没有正确按照level排序导致的
    
    if (father == null) {
    
    System.out.println("error,Father is null");
    
    return;
    
    }
    
    Object o = father.get("children");
    
    List<Map<String, Object>> childs;
    
    if (o == null) {
    
    childs = new ArrayList<Map<String, Object>>();
    
    father.put("children", childs);
    
    } else {
    
    childs = (List<Map<String, Object>>) o;
    
    }
    
    childs.add(child);
    
    }

     只需要简单说几点:
    1.按照level升序,顶级节点在最前面。
    2.把每一个节点的父结点,先放进map。轮到子结点的时候,把它放进父结点的children中。
    3.integer比较的时候, 用queals方法,而不是==。

    4.Map的key是区分类型的。

    map.put(1,"a");

    map.get("1");

    放进去的值,和取出来的值很可能不一样。

    map的key不是同一个,integer的1和string的“1”是不同的。
    5.addChild中的父结点,不可能为null。如果出现,一定是没有按照level正确排序。 

    这种通过level的方式,构造树,好处是,构造很简单,坏处是,还得维护level,麻烦。 

  • 相关阅读:
    软件工程第三次作业
    软件工程第二次实践
    软件工程第一次作业
    剑指offer-重新排序数组,倒置链表
    剑指offer-倒数第k个节点,镜像二叉树,O(1)时间删除链表节点,
    剑指offer-判断树1中是否有树2,合并有序链表,旋转打印二维数组
    matlab基本语法
    C/C++ 二维数组实参形参的总结
    剑指offer-实现power,打印1到n位最大数
    剑指offer-旋转数组,斐波那契数列,比特1的个数
  • 原文地址:https://www.cnblogs.com/qitian1/p/6463021.html
Copyright © 2020-2023  润新知