Swift-二叉樹遍歷

二叉樹常見的四種遍歷方式枢赔,先序遍歷桅咆,中序遍歷括授,后序遍歷以及層次遍歷,先來看一張二叉樹的圖:


FlyElephant.jpg

遍歷之前我們可以先自己實(shí)現(xiàn)樹岩饼,不過為了效率荚虚,可以通過函數(shù)自己創(chuàng)建樹~

二叉樹創(chuàng)建

方式一:

var d = TreeNode(data: "d",leftChild: nil,rightChild: nil)

var b = TreeNode(data: "b",leftChild: nil,rightChild: d)

var e = TreeNode(data: "e",leftChild: nil,rightChild: nil)

var c = TreeNode(data: "c", leftChild: nil, rightChild: e)

var a = TreeNode(data: "a",leftChild: b,rightChild: c)

print("FlyElephant")
print("先序遍歷:")
preOrder(a)
print("\n中序遍歷:")
inOrder(a)
print("\n后序遍歷:")
postOrder(a)
print()
FlyElephant.png

方式二,輸入一個(gè)先序的二叉樹序列籍茧,空節(jié)點(diǎn)設(shè)置為#版述,以上圖為例:

let rootList="ABD##E##CF###"
var rootIndex = -1

func createTree(inout root:TreeNode?) -> Void {
    
    rootIndex=rootIndex+1
    
    if rootIndex>=rootList.characters.count {
        return
    }
    
    let data=rootList[rootIndex] as String
    if data != "#" {
        root = TreeNode()
        root?.data = data
        
        createTree(&root!.leftChild)
        createTree(&root!.rightChild)
    } else {
        root = nil
    }
}

二叉樹的定義:

class TreeNode: NSObject {
    var data:NSString?
    var leftChild:TreeNode?
    var rightChild:TreeNode?
    
    override init() {}
    
    init(data:NSString,leftChild:TreeNode?,rightChild:TreeNode?) {
        self.data = data
        self.leftChild = leftChild
        self.rightChild = rightChild
    }
}

先序遍歷

遍歷的順序:根節(jié)點(diǎn)->左節(jié)點(diǎn)->右節(jié)點(diǎn)

func preOrder(rootNode:TreeNode?) -> Void {
    if rootNode != nil {
        if let data = rootNode?.data {
            print("\(data)\t", terminator: "")
            preOrder(rootNode?.leftChild)
            preOrder(rootNode?.rightChild)
        }
    }
}

中序遍歷

遍歷的順序:左節(jié)點(diǎn)->根節(jié)點(diǎn)->右節(jié)點(diǎn)

func inOrder(rootNode:TreeNode?) -> Void {
    if rootNode != nil {
        if let data = rootNode?.data {
            inOrder(rootNode?.leftChild)
            print("\(data)\t", terminator: "")
            inOrder(rootNode?.rightChild)
        }
    }
}

后序遍歷

遍歷的順序:左節(jié)點(diǎn)->右節(jié)點(diǎn)->根節(jié)點(diǎn)

func postOrder(rootNode:TreeNode?) -> Void {
    if rootNode != nil {
        if let data = rootNode?.data {
            postOrder(rootNode?.leftChild)
            postOrder(rootNode?.rightChild)
            print("\(data)\t", terminator: "")
        }
    }
}

層次遍歷

遍歷的方式從上到下,從左到右:

func levelOrder(rootNode:TreeNode?) -> Void {
    var arr:[AnyObject]=[];
    arr.append(rootNode!);
    
    while arr.count>0 {
        let firstNode=arr[0] as! TreeNode
        
        if let data=firstNode.data {
            print("\(data)\t", terminator: "")
            arr.removeFirst()
        }
        
        if (firstNode.leftChild != nil) {
            arr.append(firstNode.leftChild!)
        }
        
        if (firstNode.rightChild != nil) {
            arr.append(firstNode.rightChild!)
        }
    }
}

測(cè)試

let rootList="ABD##E##CF###"
var rootIndex = -1

func createTree(inout root:TreeNode?) -> Void {
    
    rootIndex=rootIndex+1
    
    if rootIndex>=rootList.characters.count {
        return
    }
    
    let data=rootList[rootIndex] as String
    if data != "#" {
        root = TreeNode()
        root?.data = data
        
        createTree(&root!.leftChild)
        createTree(&root!.rightChild)
    } else {
        root = nil
    }
}

var rootNode:TreeNode?
createTree(&rootNode)
print("先序遍歷:")
preOrder(rootNode)
print("\n中序遍歷:")
inOrder(rootNode)
print("\n后序遍歷:")
postOrder(rootNode)
print("\n層次遍歷:")
levelOrder(rootNode)

測(cè)試結(jié)果如圖所示:


FlyElephant.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末硕糊,一起剝皮案震驚了整個(gè)濱河市院水,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌简十,老刑警劉巖檬某,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異螟蝙,居然都是意外死亡恢恼,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門胰默,熙熙樓的掌柜王于貴愁眉苦臉地迎上來场斑,“玉大人,你說我怎么就攤上這事牵署÷┮” “怎么了?”我有些...
    開封第一講書人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵奴迅,是天一觀的道長(zhǎng)青责。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么脖隶? 我笑而不...
    開封第一講書人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任扁耐,我火速辦了婚禮,結(jié)果婚禮上产阱,老公的妹妹穿的比我還像新娘婉称。我一直安慰自己,他們只是感情好构蹬,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開白布王暗。 她就那樣靜靜地躺著,像睡著了一般怎燥。 火紅的嫁衣襯著肌膚如雪瘫筐。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,262評(píng)論 1 308
  • 那天铐姚,我揣著相機(jī)與錄音策肝,去河邊找鬼。 笑死隐绵,一個(gè)胖子當(dāng)著我的面吹牛之众,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播依许,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼棺禾,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了峭跳?” 一聲冷哼從身側(cè)響起膘婶,我...
    開封第一講書人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蛀醉,沒想到半個(gè)月后悬襟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拯刁,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年脊岳,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片垛玻。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡割捅,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出帚桩,到底是詐尸還是另有隱情亿驾,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布账嚎,位于F島的核電站颊乘,受9級(jí)特大地震影響参淹,放射性物質(zhì)發(fā)生泄漏醉锄。R本人自食惡果不足惜乏悄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望恳不。 院中可真熱鬧檩小,春花似錦、人聲如沸烟勋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽卵惦。三九已至阻肿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間沮尿,已是汗流浹背丛塌。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留畜疾,地道東北人赴邻。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像啡捶,于是被迫代替她去往敵國和親姥敛。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容