如何在 Core Data 中建模二叉树?
Posted
技术标签:
【中文标题】如何在 Core Data 中建模二叉树?【英文标题】:How can I model a binary tree in Core Data? 【发布时间】:2020-12-01 19:42:10 【问题描述】:我目前有一个具有两个关系的实体:leftChild
和 rightChild
:
Node:
leftChild: Node (no inverse)
rightChild: Node (no inverse)
现在我希望每个节点都有一个parent
,并将其设置为两个孩子的逆:
Node:
leftChild: Node (`parent` is inverse)
rightChild: Node (`parent` is inverse)
parent: Node
问题是,Core Data 似乎不喜欢将parent
作为两个关系的倒数。但是当然 leftChild 和 rightChild 将有相同的父级。所以我最终得到了这个不满意的结果:
Node:
leftChild: Node (`leftParent` is inverse)
rightChild: Node (`rightParent` is inverse)
leftParent: Node
rightParent: Node
但是“leftParent”和“rightParent”没有意义,因为只有一个父母。有没有更好的建模方法?
【问题讨论】:
如果您向节点添加偏向感(左/右),您的模型是否会中断,因为从父级到子级的一对多关系将处理拆分,并且从那里左或右节点是一个过滤掉。 为了确保我理解@WarrenBurton,你说的是而不是leftChild和rightChild,我应该只有children
是一个孩子数组,并假设这个数组只有2个孩子?
类似:***.com/q/4985075/1187415,***.com/q/46686694/1187415。
【参考方案1】:
将父母与孩子的关系建模为to-many
,将孩子与父母的关系建模为to-one
如果您的节点带有偏向感,例如isLeft: Bool
,则可以通过过滤器或谓词产生左右节点。
extension Node
var leftNode: Node?
return (children as? Set<Node>)?
.filter( $0.isLeft )
.first
var rightNode: Node?
return (children as? Set<Node>)?
.filter( !$0.isLeft )
.first
其他建议,例如为to-many
关系使用有序集也可能更适合您的用例。
【讨论】:
以上是关于如何在 Core Data 中建模二叉树?的主要内容,如果未能解决你的问题,请参考以下文章
javascript数据结构与算法--二叉树(插入节点生成二叉树)