大家都開始上班了吧?我春節在家準備了 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 題,是乙個典型的有關遍歷的題目。為了按層遍歷,我們需要使用「佇列」,來將每一層的節點先儲存下來,然後再依次處理。
因為我們不但需要按層來遍歷,還需要按層來輸出結果,所以我在**中使用了兩個佇列,分別名為level
和nextlevel
,用於儲存不同層的節點。
最終,整個演算法邏輯是:
判斷輸入引數是否是為空。
將根節點加入到佇列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...