Swift算法之二叉樹實現(xiàn)的方法示例
一、概述
二叉樹的結(jié)構(gòu)一般是以二叉鏈表的形式來存儲的。二叉鏈表的結(jié)構(gòu)類似于雙向鏈表,二叉鏈表的節(jié)點也是有兩個結(jié)點指針的,一個指向左子樹,一個指向右子樹。二叉樹主要有四種遍歷方式:先序遍歷、中序遍歷、后序遍歷、層次遍歷。關(guān)于二叉樹的內(nèi)容網(wǎng)上有很多,這里不再做過多的陳述。
本文將用Swift去實現(xiàn)二叉樹的創(chuàng)建、四種遍歷方式等。下面的實現(xiàn)部分內(nèi)容參考了青玉伏案和唐巧兩位大神相關(guān)的文章。
二、實現(xiàn)思路及代碼
以下面二叉樹為例:
先序遍歷:先遍歷根節(jié)點然后再遍歷左子樹,最后遍歷右子樹。
故上面先序遍歷的順序為: A B D E C F
不過為了看到更詳細的步驟可以把上面 C 結(jié)點的左子節(jié)點的 value 值打印為#號,類似的D、E、F也一樣,他們的左右子節(jié)點的 value 值都打印為#號,則打印結(jié)果為:A B D # # E # # C # F # #
中序遍歷:先遍歷左子樹,然后遍歷根節(jié)點,最后遍歷右子樹。
故上面先序遍歷的順序為:# D # B # E # A # C # F #
后序遍歷:后序遍歷是先遍歷左子樹,然后再遍歷右子樹,最后遍歷根節(jié)點
故上面先序遍歷的順序為:# # D # # E B # # # F C A
層次遍歷:層次遍歷相對上面的幾個遍歷實現(xiàn)起來要稍微復雜,層次遍歷就是圖中以二叉樹的根節(jié)點為起始節(jié)點的廣度搜索(BFS)
故上面先序遍歷的順序為:A B C D E # F # # # # # #
下面為上述幾種遍歷的Swift實現(xiàn):
class BinaryTreeNote{ var value:String var leftChild:BinaryTreeNote? var rightChild:BinaryTreeNote? init(_ value:String) { self.value = value } } class BinaryTreeHelper{ var array:[String] var index = -1 init(_ array:[String]) { self.array = array } //創(chuàng)建二叉樹 func createTree() -> BinaryTreeNote? { self.index = self.index + 1 if index < self.array.count && index >= 0 { let value = self.array[index] if value == "" { return nil } else { let note = BinaryTreeNote(value) note.leftChild = createTree() note.rightChild = createTree() return note } } return nil; } //先序遍歷二叉樹 func preOrderTraverse(_ note:BinaryTreeNote?){ if note == nil { print("#") return } print(note!.value) preOrderTraverse(note!.leftChild) preOrderTraverse(note!.rightChild) } //中序遍歷二叉樹 func inOrderTraverse (_ note: BinaryTreeNote?) { if note == nil { print("#") return } inOrderTraverse(note!.leftChild) print(note!.value) inOrderTraverse(note!.rightChild) } //后序遍歷二叉樹 func afterOrderTraverse (_ note: BinaryTreeNote?) { if note == nil { print("#") return } afterOrderTraverse(note!.leftChild) afterOrderTraverse(note!.rightChild) print(note!.value) } //層次遍歷二叉樹 func levelOrder(_ root: BinaryTreeNote?){ var result = [[BinaryTreeNote]]() var level = [BinaryTreeNote]() level.append(root!) while level.count != 0 { result.append(level) var nextLevel = [BinaryTreeNote]() for node in level { if let leftNode = node.leftChild { nextLevel.append(leftNode) } if let rightNode = node.rightChild { nextLevel.append(rightNode) } } level = nextLevel } let ans = result.map { $0.map { $0.value }} print(ans) } }
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者使用swift能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
mac git xcrun error active developer path 錯誤
本文主要是講訴了如何解決在mac下使用git;xcode4.6的環(huán)境時,出現(xiàn)了錯誤(mac git xcrun error active developer path)的解決辦法,希望對大家有所幫助2014-09-09用SwiftUI實現(xiàn)3D Scroll滾動效果的實現(xiàn)代碼
這篇文章主要介紹了用SwiftUI實現(xiàn)3D Scroll效果的實現(xiàn)代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習2020-04-04Compose聲明式代碼語法對比React?Flutter?SwiftUI
這篇文章主要為大家介紹了Compose聲明式代碼語法對比React?Flutter?SwiftUI來解釋為什么說?Compose?的聲明式代碼最簡潔,有需要的朋友可以借鑒參考下2022-08-08