如何在 Core Data 中建模二叉树?

Posted

技术标签:

【中文标题】如何在 Core Data 中建模二叉树?【英文标题】:How can I model a binary tree in Core Data? 【发布时间】:2020-12-01 19:42:10 【问题描述】:

我目前有一个具有两个关系的实体:leftChildrightChild

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数据结构与算法--二叉树(插入节点生成二叉树)

如何在二叉树中找到最小值和最大值

[Data Structure & Algrithom] 二叉树

请问C语言如何创建二叉树????

如何在数据结构中,以二叉链表为存储结构,建立一棵二叉树,输出其先序,中序,后序遍历序列,统计其叶子