美文网首页
Swift 5.3 数据结构 —— 树 Tree

Swift 5.3 数据结构 —— 树 Tree

作者: Sunooo | 来源:发表于2020-11-08 22:19 被阅读0次

树 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

相关文章

  • Swift 5.3 数据结构 —— 树 Tree

    树 Tree 树型结构是一种嵌套结构,一种非线性数据结构。一个树由多个节点组成,第一个节点称为根节点(root),...

  • 索引

    01 B+ Tree 原理 1. 数据结构 B Tree 指的是 Balance Tree,也就是平衡树。平衡树是...

  • B+树原理

    B+树原理 数据结构 B Tree 指的是 Balance Tree,也就是平衡树。平衡树是一颗查找树,并且所有叶...

  • Java数据结构之 树(Tree)

    Java数据结构之 树(Tree) 1. 二叉查找树(Binary Search Tree) 性质: 1)若左子树...

  • Merkle Tree

    Merkle Tree,是一种树(数据结构中所说的树),网上大都称为Merkle Hash Tree,这是因为 它...

  • markle tree

    一、什么是 Merkle Tree?Merkle Tree,是一种树(数据结构中所说的树),网上大都称为Merkl...

  • Swift 数据结构 - AVL树(AVL Tree)

    AVL树 平衡二叉搜索树(Self-balancing binary search tree)又被称为AVL树(有...

  • Mysql Innodb

    B+ Tree 原理 1. 数据结构 B Tree 指的是平衡树 。平衡树是一颗查找树,并且所有叶子节点位于同一...

  • JDK1.8 之 集合框架 TreeMap TreeSet

    了解 Tree 之前我们必须了解 红黑树 因为Tree 的数据结构就是红黑树 红黑树的特性(1)每个节点或者是黑色...

  • JavaScript 中的树数据结构

    JavaScript 中的树数据结构[https://stackfull.dev/tree-data-struct...

网友评论

      本文标题:Swift 5.3 数据结构 —— 树 Tree

      本文链接:https://www.haomeiwen.com/subject/ulmevktx.html