类算法问题:无限级树 如何在某个结点改变状态的时候同时影响上级结点和下级所有结点

假设有一个无限级树,比如这种

  • 标题1

    • 标题1-1

      • 标题1-1-1
      • 标题1-1-2
    • 标题1-2
    • 标题1-3
    • 标题1-4

如果其中一个结点状态改变,那么会影响它的所有子结点以及它的父结点、祖父结点、曾祖父结点等等
比如“标题1-1”发生改变,那么“标题1-1-1”、“标题1-1-2”、“标题1”都会有相应改变

以下开始说人话

有这么一个需求,就是一个todolist
每个todo下都可以新建任意个todo,并且可以建到任意深度
如果一个todo完成了,那么它的所有子todo都是完成状态,同时它的父结点要能够触发判断自己的所有子todo是不是都完成了,如果都完成了,那么这个父结点本身也要显示为完成状态,同时要继续触发祖父结点做这个检查

范例todo列表如下

clipboard.png

目前我的做法

每一个todo的完成状态改变的时候,都递归地查找它的父结点和子结点,做上面的判断。
具体做法是:
每个结点都有一个独一无二的key,每个结点也都记录了父结点的key
当结点状态改变的时候,遍历搜索整颗树,寻找它的父节点,判断父节点的状态。父节点也同样递归地做这件事:遍历搜索整颗树,寻找祖父结点,判断状态。
同时,把这个结点的所有子节点的状态都做对应改变(比如这个结点是“完成”,那么所有子节点都是“完成”)

但是感觉代码不够优雅。

所以问题是

怎么优雅地实现?

阅读 2.9k
2 个回答

把key变成实例

子节点,就用递归去check
父节点,就递归往上找父的id,然后判断该父里子集的check是否全部check,然后判断父级是check还是indeterminate

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题