Java非递归实现多叉树型结构遍历成JSON字符串

普通的树形菜单生成是采用递归法,比较浪费时间和空间。在查询出的树形菜单数据是有序排列的情况下,我采用倒序的遍历,拼凑出最终的树,只使用了1次for循环,以空间换时间,效果还不错,具体的原理稍后补充。
数据库中数据如下:
Java非递归实现多叉树型结构遍历成JSON字符串_第1张图片
可以看到,在mid有序排列的情况下,如果倒序从mid为38的记录中获得pid35,然后获得到mid为35的记录,在其Chirldren属性中追加该mid为38的记录,同时继续往上遍历mid为37的记录,依次压缩树形菜单,最终剩下的就是树形菜单的根节点,根节点中包含树形菜单,这样就倒序遍历一遍,即可获得树形菜单。
实现代码:

public class Mian {

    static String sql = null;
    static DBHelper db = null;
    static ResultSet ret = null;

    public static void main(String[] args) throws Exception {
        sql = "select mid,pid,text,issort from cc_Xuefen";
        db = new DBHelper(sql);
        ret = db.pst.executeQuery();// 执行查询
        List orgList = (List) Model.resultSetToList(ret, BaseXuefen.class);
        List keyList = new ArrayList();
        HashMap hashMap = new HashMap();
        for (BaseXuefen baseOrg : orgList) {
            XuefenTreeItem o = new XuefenTreeItem(baseOrg);
            hashMap.put(baseOrg.getMid(), o);
            keyList.add(baseOrg.getMid());
        }
        for (int i = keyList.size() - 1; i >= 0; i--) {
            XuefenTreeItem oti = hashMap.get(keyList.get(i));
            if (hashMap.containsKey(oti.getPid())) {
                XuefenTreeItem otiFather = hashMap.get(oti.getPid());
                List otiChirldrenList = null;
                if (otiFather.getChildren() == null) {
                    otiChirldrenList = new ArrayList();
                } else {
                    otiChirldrenList = otiFather.getChildren();
                }
                otiChirldrenList.add(oti);
                otiFather.setChildren(otiChirldrenList);
                hashMap.put(keyList.get(i), otiFather);
                hashMap.remove(keyList.get(i));
            }
        }
        List tree = new ArrayList();
        for (Entry o : hashMap.entrySet()) {
            tree.add(o.getValue());
        }
        System.out.println(JSON.toJSONString(tree));
        ret.close();// 关闭结果集
        db.close();// 关闭连接

    }

}

运行结果:
Java非递归实现多叉树型结构遍历成JSON字符串_第2张图片

你可能感兴趣的:(Java笔记)