按層遍歷二叉樹的節點

2022-09-14 08:21:12 字數 1830 閱讀 1777

大家都開始上班了吧?我春節在家準備了 5 篇面試題系列的文章,想著大家過節估計也沒興趣閱讀,所以節後再發。這些題目大都選自 leetcode,屬於簡單到中等型別的難度。還在糾結學演算法有沒有用的同學,請參閱:搞 ios 的學演算法有意義嗎?

解題**都是使用 swift 完成的,我也盡量在**中使用了 swift 語言的一些特性,大家可以順便學學 swift。

h**e fun!

給你一棵二叉樹,請按層輸出其的節點值,即:按從上到下,從左到右的順序。

3

/ \9  20

/  \

15   7

輸出結果應該是:

[

[3],

[9,20],

[15,7]

]

本題的 swift **模版如下:

private class treenode 

}class solution

}

本題出自 leetcode 第 102 題,是乙個典型的有關遍歷的題目。為了按層遍歷,我們需要使用「佇列」,來將每一層的節點先儲存下來,然後再依次處理。

因為我們不但需要按層來遍歷,還需要按層來輸出結果,所以我在**中使用了兩個佇列,分別名為levelnextlevel,用於儲存不同層的節點。

最終,整個演算法邏輯是:

判斷輸入引數是否是為空。

將根節點加入到佇列level中。

如果level不為空,則:

3.1 將level加入到結果ans中。

3.2 遍歷level的左子節點和右子節點,將其加入到nextlevel中。

3.3 將nextlevel賦值給level,重複第 3 步的判斷。

ans中的節點換成節點的值,返回結果。

因為我們是用

swift 來實現**,所以我使用了一些 swift

語言的特性。例如:佇列中我們儲存的是節點的資料結構,但是最終輸出的時候,我們需要輸出的是值,在**中,我使用了 swift

的函式式的鏈式呼叫,將巢狀陣列中的元素型別做了一次變換,如下所示:

let ans = result.map }
另外,我們也使用了 swift 特有的guard關鍵字,來處理引數的特殊情況。

//

//  binary tree level order tr**ersal.swift

////  created by tang qiao.

//import foundation

private class treenode

}private class solution

var result = [[treenode]]()

var level = [treenode]()

while level.count != 0

if let rightnode = node.right

}level = nextlevel

}let ans = result.map }

return ans

}}

完成這道題的同學,可以試著練習一下 leetcode 的第 107 題,看看能不能只改動一行**,就把 107 題也解決掉。

玩得開心!

按層遍歷二叉樹

include include typedef struct bitnodebitnode,bitree 定義二叉樹型別 typedef struct qnodeqnode,queueptr 建立鏈 typedef struct linkqueue 建立佇列 void enqueue linkque...

二叉樹3 二叉樹按層遍歷列印

題目 有一棵二叉樹,請設計乙個演算法,按照層次列印這棵二叉樹。給定二叉樹的根結點root,請返回列印結果,結果按照每一層乙個陣列進行儲存,所有陣列的順序按照層數從上往下,且每一層的陣列內元素按照從左往右排列。保證結點數小於等於500。思路 對於二叉樹,除了先序遍歷 中序遍歷 後序遍歷之外,常用的遍歷...

二叉樹層序遍歷 求二叉樹的層序遍歷

給定乙個二叉樹,返回該二叉樹層序遍歷的結果,從左到右,一層一層地遍歷 例如 給定的二叉樹是,該二叉樹層序遍歷的結果是 3 9,20 15,7 示例1 輸入 返回值 1 2 示例2輸入 返回值 1 2,3 4,5 解題思路 重點是如何把在一層的節點放到一起,設定乙個引數專門放一層的節點 class t...