[Swift 開發] 遍歷二叉樹(前序、中序、後序、層序)

創建二叉樹模型

//用的是遞歸枚舉的方式
indirect enum BinaryTree {
    case node(_ l:BinaryTree, _ v:String, _ r:BinaryTree)
    case empty
}

初始化數據

let nodeI = BinaryTree.node(.empty, "I", .empty)
let nodeG = BinaryTree.node(.empty, "G", .empty)
let nodeH = BinaryTree.node(nodeI,  "H", .empty)
let nodeJ = BinaryTree.node(.empty, "J", .empty)
let nodeD = BinaryTree.node(nodeG,  "D", nodeH)
let nodeE = BinaryTree.node(.empty, "E", nodeJ)
let nodeF = BinaryTree.node(.empty, "F", .empty)
let nodeB = BinaryTree.node(nodeD,  "B", .empty)
let nodeC = BinaryTree.node(nodeE,  "C", nodeF)
let nodeA = BinaryTree.node(nodeB,  "A", nodeC)

數據類型應該是

前遍歷

func frontTraverseTree(tree:BinaryTree)
{
    switch tree {
    case .node(let l, let v, let r):
        print(v)
        traverseTree(tree: l) 
        traverseTree(tree: r)
        
    default:
         break
    }
}

中遍歷

func centreTraverseTree(tree:BinaryTree)
{
    switch tree {
    case .node(let l, let v, let r): 
        traverseTree(tree: l) 
        print(v)
        traverseTree(tree: r)
        
    default:
         break
    }
}

後遍歷

func laterTraverseTree(tree:BinaryTree)
{
    switch tree {
    case .node(let l, let v, let r): 
        traverseTree(tree: l)  
        traverseTree(tree: r)
        print(v)
        
    default:
         break
    }
}

層遍歷

func levelTree(tree:BinaryTree)
{
    var values = [[String]]()
    var nodes = [tree]
    while !nodes.isEmpty {
        let r = getNodes(nodes)
        values.append(r.v)
        nodes = r.nodes
    }
    
    let result = values.flatMap { $0}
    print(result)
}

func getNodes(_ nodes: [BinaryTree]) -> (v: [String], nodes: [BinaryTree])
{
    var values = [String]()
    var nextNodes = [BinaryTree]()
    for n in nodes {
        switch n {
        case .node(let l, let v, let r) :
            values.append(v)
            nextNodes.append(l)
            nextNodes.append(r)
        default:
            break
        }
    }
    
    return (values, nextNodes)
}

打印結果

前遍歷:ABDGHICEJF

中遍歷:GDIHBAEJCF

後遍歷:GIHDBJEFCA

層遍歷:["A", "B", "C", "D", "E", "F", "G", "H", "J", "I"]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章