在Swift中的UITableView中具有重复叶子的树结构

时间:2017-09-05 02:08:30

标签: swift uitableview data-structures tree

我正在创建一个带有tableView的菜单,最终导致用户输入某个参数,然后输出结果。

菜单由多个页面组成,根据用户选择的内容,它将提供不同的用户输入。它与iPhone设置非常相似。

现在,我对菜单进行建模的方式是树形结构:

class Node {

    let value: Modules

    var parentNode: Node?
    var childenNode = [Node]()

    var childCount: Int {
        return childenNode.count
    }

    func appendNode(node: Node) {
        childenNode.append(node)
        node.parentNode = self
    }

    func isLeaveNode() -> Bool {
        return childenNode.isEmpty
    }

    init(module: Modules) {
        self.value = module
    }              
}

这是非常简单和典型的树数据结构。我的问题是,可能存在重复的节点,这意味着将覆盖父节点。例如,给定这样的结构:

             [1] 
           /     \
       [2]         [3]
      /               \
   [4]                 [4]

如果我用我的代码对这棵树进行建模,它将如下所示:

let node1 = Node(.1)
let node2 = Node(.2)
let node3 = Node(.3)
let node4 = Node(.4)

node1.appendNode(node2)
node1.appendNode(node3)

node2.appendNode(node4)
node3.appendNode(node4)

由于节点4的外观是 NOT 唯一,因此将覆盖node4的父级,而父级现在为node3。然而,node2node3应该共享相同的叶子。我应该如何更改我的代码,以便任何给定的叶节点可以有多个父节点?

其他信息:Modulesenum。只需创建更多enum成员就可以轻松解决这个问题,但还有其他方法可以解决问题吗?

欢迎任何建议!

谢谢!

2 个答案:

答案 0 :(得分:0)

您可以更改

var parentNode: Node?var parentNodes: [Node?]

func appendNode(node: Node) {
    childenNode.append(node)
    node.parentNodes.append(self)
}

然而,这是不好的做法。您将不再拥有树,而是图表。

答案 1 :(得分:0)

Modules似乎是一个枚举,因此是一个值。如果Modules确实具有值语义,那么您需要做的就是创建两个不同的Node(.4)。每个都有一个单独的父母。不要保留node4变量,而是信任您的树结构,并自信地在其中导航。

node2.appendNode(Node(.4))
node3.appendNode(Node(.4))

您需要重新思考我们的课程,以及如何更直观地构建树。

可能是一些东西
init(_ module: Module, children: [Node] = [Node]()) {
  self.value = module
  self.children = children
  foreach child in self.children {
    child.parent = self
  }
}

现在您可以像这样初始化您的树。

let root =
      Node(.1, children:
      [
        Node(.2, children: [Node(.4)]),
        Node(.3, children: [Node(.4)])
      ])