Swift 树的自定义遍历逻辑

Swift 树的自定义遍历逻辑,swift,Swift,我有一个平面列表,我用这个代码将其转换为树 class Node { var Children: [Node] = [] weak var parent: Node? weak var nextObject: Node? var associatedObject: AppListItem? init(associatedObject: AppListItem) { self.associatedObject = associatedObj

我有一个平面列表,我用这个代码将其转换为树

class Node {
    var Children: [Node] = []
    weak var parent: Node?
    weak var nextObject: Node?
    var associatedObject: AppListItem?

    init(associatedObject: AppListItem) {
        self.associatedObject = associatedObject
    }
}

func getRootsFrom(list: [AppListItem]) -> [Node] {
    var dict: [String : Node] = [:]
    list.forEach { (appItem) in
        dict[appItem.uuid] = Node(associatedObject: appItem)
    }
    dict.values.forEach { (node) in
        var proposedParent: Node
        if let value = dict[node.associatedObject?.parentUUID ?? ""] {
            proposedParent = value
            node.parent = proposedParent
            proposedParent.Children.append(node)
            proposedParent.Children.sort(by: {$0.associatedObject?.sort ?? "" < $1.associatedObject?.sort ?? ""})
            proposedParent.nextObject = proposedParent.Children.first
        }
    }
    return dict.values.filter({$0.parent == nil}).sorted(by: {$0.associatedObject?.sort ?? "" < $1.associatedObject?.sort ?? ""})
}
类节点{
变量子项:[Node]=[]
弱var父节点?
弱var nextObject:节点?
变量关联对象:AppListItem?
init(关联对象:AppListItem){
self.associatedObject=associatedObject
}
}
func getRootsFrom(列表:[AppListItem])->[Node]{
变量dict:[字符串:节点]=[:]
中的list.forEach{(appItem)
dict[appItem.uuid]=节点(关联对象:appItem)
}
中的dict.values.forEach{(节点)
var proposedParent:节点
如果let value=dict[node.associatedObject?.parentUUID???”]{
proposedParent=值
node.parent=proposedParent
proposedParent.Children.append(节点)
proposedParent.Children.sort(按:{$0.associatedObject?.sort??“<$1.associatedObject?.sort??”})
proposedParent.nextObject=proposedParent.Children.first
}
}
返回dict.values.filter({$0.parent==nil}).sorted(排序依据:{$0.associatedObject?.sort??“<$1.associatedObject?.sort??”)
}
其中
getRootsFrom
将列表转换为树,并返回根,我在为每个对象正确标记nextObject时遇到问题

所以下一个对象应该是

饮料->冷->牛奶->苏打->苦柠檬->姜汁汽水

在这之后,它应该去

热的

等等

我不太确定我的代码是否正确,它唯一的标记是直到第一个叶子,然后在下一个对象变为零


感谢您的帮助。

看起来您已经在构建树了,因此将其放入列表应该相当简单。根据您的图像,看起来您希望使用。首先,我将填充方法添加到
节点

func preorder() -> [Node] {
    return [self] + Children.flatMap { $0.preorder() }
}
然后在
getRootsFrom
中将返回值更改为

return dict.values.first(where: {$0.parent == nil})?.preorder() ?? []

这本书是一个很好的阅读资料来源。它用图像和伪代码显示不同的顺序。

您需要先构建树。然后进行深度优先遍历,为每个节点填充
nextObject
。在树完全构建之前,您无法填充
nextoObject
。谢谢rmaddy,我研究了一点深度优先遍历,但不太了解它,有没有这样做的例子谢谢,这就是我需要的。