waiaan
V2EX  ›  算法

请教一个树比对的算法

  •  
  •   waiaan · Mar 23, 2022 · 1500 views
    This topic created in 1536 days ago, the information mentioned may be changed or developed.

    无标题

    左边是树,右边是树形表格,右边的表格展示左边树的勾选项,表格每行的顺序都是可以在本层级进行调整,不一定按左边树的顺序,新勾选的直接插入本层级的末尾,取消勾选的要从表格中删除。

    不知道表达清楚没有,目前的做法是构建每个树节点的节点路径数组,然后遍历数组一层一层往里算。

    求更好的方法,谢谢。

    5 replies    2022-04-04 04:31:58 +08:00
    sillydaddy
        1
    sillydaddy  
       Mar 25, 2022 via Android
    大家都没有回复,应该是没看懂你的表述。。
    waiaan
        2
    waiaan  
    OP
       Mar 25, 2022
    @sillydaddy
    就是勾选左边的节点,把这个节点插入到右边的表格对应层级的位置,取消勾选则要从表格中删除。
    sillydaddy
        3
    sillydaddy  
       Mar 25, 2022
    不知道你用的什么界面库构造的表格,我能想到的比「遍历数组一层一层往里算」稍微好点的办法是,用 map 或者 dictionary ,根据待操作节点的父节点 id ,找到这个父节点在表格中对应的那行,然后执行添加或者删除操作。能这样做的前提还得是,能用 map 或 dictionary 保存表格的各行。
    我感觉节点路径数组也不错啊,react-sortable-tree 就是用的节点路径数组。标题「树比对的算法」跟这个也差太多了吧。
    waiaan
        4
    waiaan  
    OP
       Mar 25, 2022
    @sillydaddy
    感谢。
    两边的数据结构都是这种树形结构
    ```js
    [{
    id: 1,
    label: '一级 1',
    children: [{
    id: 4,
    label: '二级 1-1',
    children: [{
    id: 9,
    label: '三级 1-1-1'
    }, {
    id: 10,
    label: '三级 1-1-2'
    }]
    }]
    }]
    ```
    差不多就是树比对的意思,右边的项与左边勾选的项进行比较,多的删除,少的添加。
    Gav1nw
        5
    Gav1nw  
       Apr 4, 2022
    在我印象里,树的便利,用递归实现效果更好吧?我能想到是递归+NLR 算法
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2890 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 05:44 · PVG 13:44 · LAX 22:44 · JFK 01:44
    ♥ Do have faith in what you're doing.