[讨论/问答][Java]如何将树形结构转为扁平集合 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
gaopinsong
V2EX    Java

[讨论/问答][Java]如何将树形结构转为扁平集合

  •  
  •   gaopinsong 2015-12-15 00:28:03 +08:00 5474 次点击
    这是一个创建于 3593 天前的主题,其中的信息可能已经有所发展或是发生改变。

    问题就如题。将树形结构转为扁平的集合。
    想不用递归。或者其他高性能的实现方式。
    最想的就是能用上 J8 最新的 Stream API 。
    但是自己咋想也想不到比较靠谱的实现。
    这里提供一个借口供大家举例。

    class Node { private String name; private List<ode> children; // get set ignore } 
    19 条回复    2015-12-17 16:01:49 +08:00
    msg7086
        1
    msg7086  
       2015-12-15 01:13:30 +08:00
    不想用递归就把递归转换成队列或者栈。
    pynix
        2
    pynix  
       2015-12-15 04:15:42 +08:00
    遍历一遍,扔到列表去。
    yimity
        3
    yimity  
       2015-12-15 07:30:24 +08:00 via iPhone
    @pynix 遍历不得递归嘛?我还是用的递归
    yimity
        4
    yimity  
       2015-12-15 07:31:38 +08:00 via iPhone
    不过我貌似是存成扁平的然后遍历成树形
    linux40
        5
    linux40  
       2015-12-15 08:28:18 +08:00 via Android
    看见楼上都说遍历,我插一嘴,树的遍历只靠循环妥妥的。
    yuankui
        6
    yuankui  
       2015-12-15 09:31:18 +08:00
    跟语言无关..
    yuankui
        7
    yuankui  
       2015-12-15 09:32:10 +08:00   1
    楼主搜一下 深度优先 || 广度优先
    zhuangzhuang1988
        8
    zhuangzhuang1988  
       2015-12-15 09:49:13 +08:00
    flatMap ??
    wizardoz
        9
    wizardoz  
       2015-12-15 09:52:21 +08:00   1
    深度优先用栈(其实用到栈就相当于递归),广度优先用队列。
    sleeperqp
        10
    sleeperqp  
       2015-12-15 11:23:45 +08:00
    第一反应是并查集
    HypoChen
        11
    HypoChen  
       2015-12-15 11:27:55 +08:00
    bfs or dfs
    gaopinsong
        12
    gaopinsong  
    OP
       2015-12-15 13:57:09 +08:00
    感谢大家的回复,今天也问了一个高端大学出来的同学,也是让我去搜
    深度优先 || 广度优先
    又学到了新的姿势。感谢各位的回复
    pke
        13
    pke  
       2015-12-15 14:07:16 +08:00
    这个和 Dijkstra 算法有什么关系
    KotiyaSanae
        14
    KotiyaSanae  
       2015-12-15 14:12:02 +08:00
    https://gist.github.com/SeavantUUz/74e91be581099e5536aa 把二叉树压成一个字符串(确实是扁平的集合),没有递归,因为是迭代实现的
    domty
        15
    domty  
       2015-12-15 19:7:25 +08:00
    不用递归
    用 while 循环加 stack 就可以了嘛
    况且以我浅薄的经验来看
    java 的尾递归调用在不适用 java8 的某些尾递归优化的特性的情况下 效率是弱于非递归调用的
    FrankFang128
        16
    FrankFang128  
       2015-12-16 00:37:25 +08:00 via Android
    没人吐槽 J8...
    gaopinsong
        17
    gaopinsong  
    OP
       2015-12-17 16:00:25 +08:00
    自己搞了个递归。对于 Java 针对尾递归的优化,不是很了解。回头去搜索下

    private Stream<CategoryModel> flatTree(List<CategoryModel> categoryModels) {

    Stream<CategoryModel> modelStream = categoryModels.stream();

    for (CategoryModel categoryModel: categoryModels) {

    List<CategoryModel> children = categoryModel.getChild();

    if (children == null || children.size() < 1) continue;

    modelStream = Stream.concat(modelStream, flatTree(children));
    }

    return modelStream;
    }

    调用的代码

    Stream<CategoryModel> modelStream = flatTree(getCategoryTree());

    return modelStream.collect(toList());
    gaopinsong
        18
    gaopinsong  
    OP
       2015-12-17 16:00:58 +08:00
    自己搞了个递归。对于 Java 针对尾递归的优化,不是很了解。回头去搜索下

    private Stream<CategoryModel> flatTree(List<CategoryModel> categoryModels) {
    Stream<CategoryModel> modelStream = categoryModels.stream();
    for (CategoryModel categoryModel: categoryModels) {
    List<CategoryModel> children = categoryModel.getChild();
    if (children == null || children.size() < 1) continue;
    modelStream = Stream.concat(modelStream, flatTree(children));
    }
    return modelStream;
    }

    调用的代码

    Stream<CategoryModel> modelStream = flatTree(getCategoryTree());
    return modelStream.collect(toList());
    gaopinsong
        19
    gaopinsong  
    OP
       2015-12-17 16:01:49 +08:00
    。。上边发的。咋没有代码格式。。。。还不能自己删除。啊
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1183 人在线   最高记录 6679    
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 37ms
    UTC 23:34 PVG 07:34 LAX 16:34 JFK 19:34
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86