树 Tree
树型结构是一种嵌套结构,一种非线性数据结构。
一个树由多个节点组成,第一个节点称为根节点(root
),其他都是他的子节点,子节点还可以有子节点
树型结构是一种族群的抽象,人类血脉传承就可以抽象为一种树型结构,面向对象语言中的继承也是树型结构。
1.先定义一个树的节点 Node
每一个节点都储存了父节点的信息,也储存了子节点的信息,和自己的值。
如果是根节点,是没有父节点的,因此父节点的类型是可选类型(optional
)
一个节点可以包含多个子节点,因此子节点是一个数组类型
public class TreeNode<T> {
public weak var parent: TreeNode?
public var value: T
public var children: [TreeNode] = []
public init(_ value: T) {
self.value = value
}
}
2.添加常用的增加、查询、遍历方法
因为树型结构是一种嵌套结构,所以遍历的时候首先考虑的就是递归思想
extension TreeNode {
public func add(_ child: TreeNode) {
children.append(child)
}
// 按照深度遍历,先遍历自己,再遍历子节点
func forEachDepthFirst(visit: (TreeNode) -> Void) {
visit(self)
children.forEach(visit)
}
// 按照层级,先遍历上层,再依次向下遍历
func forEachLevelOrder(visit: (TreeNode) -> Void) {
visit(self)
var queue = Queue<TreeNode>()
children.forEach{ queue.enqueue($0) }
while let node = queue.dequeue() {
visit(node)
node.children.forEach({ queue.enqueue($0)})
}
}
}
extension TreeNode where T : Equatable {
func search(_ value: T) -> TreeNode? {
var result: TreeNode?
forEachLevelOrder { node in
if node.value == value {
result = node
}
}
return result
}
}
3. 二叉树节点 Binary Node
二叉树就是一个节点,只包含2个子节点的树型结构,
public class BinaryNode<Element> {
public var value: Element
public var leftChild: BinaryNode?
public var rightChild: BinaryNode?
public init(value: Element) {
self.value = value
}
}
遍历二叉树的方式有很多种,也都是递归思想
public extension BinaryNode {
func traverseInOrder(visit: (Element) -> Void) {
leftChild?.traverseInOrder(visit: visit)
visit(value)
rightChild?.traverseInOrder(visit: visit)
}
func traversePreOrder(visit: (Element) -> Void) {
visit(value)
leftChild?.traversePreOrder(visit: visit)
rightChild?.traversePreOrder(visit: visit)
}
func traversePostOrder(visit: (Element) -> Void) {
leftChild?.traversePreOrder(visit: visit)
rightChild?.traversePreOrder(visit: visit)
visit(value)
}
}
github仓库地址 https://github.com/SunZhiC/DataStructuresInSwift
References
Data Structures & Algorithms in Swift by Matthijs Hollemans.
https://github.com/apple/swift-algorithms
https://github.com/raywenderlich/swift-algorithm-club