V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
waiaan
V2EX  ›  算法

请教一个树比对的算法

  •  
  •   waiaan · 2022-03-23 22:11:38 +08:00 · 999 次点击
    这是一个创建于 987 天前的主题,其中的信息可能已经有所发展或是发生改变。

    无标题

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

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

    求更好的方法,谢谢。

    5 条回复    2022-04-04 04:31:58 +08:00
    sillydaddy
        1
    sillydaddy  
       2022-03-25 09:21:59 +08:00 via Android
    大家都没有回复,应该是没看懂你的表述。。
    waiaan
        2
    waiaan  
    OP
       2022-03-25 10:19:41 +08:00
    @sillydaddy
    就是勾选左边的节点,把这个节点插入到右边的表格对应层级的位置,取消勾选则要从表格中删除。
    sillydaddy
        3
    sillydaddy  
       2022-03-25 13:03:49 +08:00
    不知道你用的什么界面库构造的表格,我能想到的比「遍历数组一层一层往里算」稍微好点的办法是,用 map 或者 dictionary ,根据待操作节点的父节点 id ,找到这个父节点在表格中对应的那行,然后执行添加或者删除操作。能这样做的前提还得是,能用 map 或 dictionary 保存表格的各行。
    我感觉节点路径数组也不错啊,react-sortable-tree 就是用的节点路径数组。标题「树比对的算法」跟这个也差太多了吧。
    waiaan
        4
    waiaan  
    OP
       2022-03-25 13:39:12 +08:00
    @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  
       2022-04-04 04:31:58 +08:00
    在我印象里,树的便利,用递归实现效果更好吧?我能想到是递归+NLR 算法
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1112 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 18:55 · PVG 02:55 · LAX 10:55 · JFK 13:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.