Swift算法之二叉樹實(shí)現(xiàn)的方法示例
一、概述
二叉樹的結(jié)構(gòu)一般是以二叉鏈表的形式來存儲的。二叉鏈表的結(jié)構(gòu)類似于雙向鏈表,二叉鏈表的節(jié)點(diǎn)也是有兩個結(jié)點(diǎn)指針的,一個指向左子樹,一個指向右子樹。二叉樹主要有四種遍歷方式:先序遍歷、中序遍歷、后序遍歷、層次遍歷。關(guān)于二叉樹的內(nèi)容網(wǎng)上有很多,這里不再做過多的陳述。
本文將用Swift去實(shí)現(xiàn)二叉樹的創(chuàng)建、四種遍歷方式等。下面的實(shí)現(xiàn)部分內(nèi)容參考了青玉伏案和唐巧兩位大神相關(guān)的文章。
二、實(shí)現(xiàn)思路及代碼
以下面二叉樹為例:

先序遍歷:先遍歷根節(jié)點(diǎn)然后再遍歷左子樹,最后遍歷右子樹。

故上面先序遍歷的順序?yàn)椋?A B D E C F
不過為了看到更詳細(xì)的步驟可以把上面 C 結(jié)點(diǎn)的左子節(jié)點(diǎn)的 value 值打印為#號,類似的D、E、F也一樣,他們的左右子節(jié)點(diǎn)的 value 值都打印為#號,則打印結(jié)果為:A B D # # E # # C # F # #
中序遍歷:先遍歷左子樹,然后遍歷根節(jié)點(diǎn),最后遍歷右子樹。

故上面先序遍歷的順序?yàn)椋? D # B # E # A # C # F #
后序遍歷:后序遍歷是先遍歷左子樹,然后再遍歷右子樹,最后遍歷根節(jié)點(diǎn)

故上面先序遍歷的順序?yàn)椋? # D # # E B # # # F C A
層次遍歷:層次遍歷相對上面的幾個遍歷實(shí)現(xiàn)起來要稍微復(fù)雜,層次遍歷就是圖中以二叉樹的根節(jié)點(diǎn)為起始節(jié)點(diǎn)的廣度搜索(BFS)

故上面先序遍歷的順序?yàn)椋篈 B C D E # F # # # # # #
下面為上述幾種遍歷的Swift實(shí)現(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)容對大家的學(xué)習(xí)或者使用swift能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
Swift免費(fèi)短信驗(yàn)證碼實(shí)現(xiàn)及動態(tài)倒計時功能
這篇文章主要介紹了Swift免費(fèi)短信驗(yàn)證碼實(shí)現(xiàn)及動態(tài)倒計時功能的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2017-02-02
用SwiftUI實(shí)現(xiàn)3D Scroll滾動效果的實(shí)現(xiàn)代碼
這篇文章主要介紹了用SwiftUI實(shí)現(xiàn)3D Scroll效果的實(shí)現(xiàn)代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)2020-04-04

