Swift 5.3 数据结构 —— 树 Tree

树 Tree

树型结构是一种嵌套结构,一种非线性数据结构。
一个树由多个节点组成,第一个节点称为根节点(root),其他都是他的子节点,子节点还可以有子节点
树型结构是一种族群的抽象,人类血脉传承就可以抽象为一种树型结构,面向对象语言中的继承也是树型结构。

1.先定义一个树的节点 Node

每一个节点都储存了父节点的信息,也储存了子节点的信息,和自己的值。
如果是根节点,是没有父节点的,因此父节点的类型是可选类型(optional
一个节点可以包含多个子节点,因此子节点是一个数组类型

public class TreeNode {
    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()
        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 {
    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

你可能感兴趣的:(Swift 5.3 数据结构 —— 树 Tree)