每日一題---從上到下打印二叉樹

從上到下打印二叉樹

從上到下打印出二叉樹的每個(gè)節(jié)點(diǎn)准验,同一層的節(jié)點(diǎn)按照從左到右的順序打印冲茸。

例如:
給定二叉樹: [3,9,20,null,null,15,7],

   3
   / \
  9  20
    /  \
   15   7

返回:

[3,9,20,15,7]

提示:

  1. 節(jié)點(diǎn)總數(shù) <= 1000

今日未能解答钾麸。

以下為參考題解所寫的Java代碼寞秃。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public int[] levelOrder(TreeNode root) {
    if (root == null) return new int[0];
    Queue<TreeNode> treeNodes = new LinkedList<TreeNode>(){{add(root);}};
    List<Integer> list = new ArrayList<>();
    while (!treeNodes.isEmpty()) {
      TreeNode treeNode = treeNodes.poll();
      list.add(treeNode.val);
      if (treeNode.left != null) treeNodes.add(treeNode.left);
      if (treeNode.right != null) treeNodes.add(treeNode.right);
    }
    int[] res = new int[list.size()];
    for (int i = 0; i < res.length; i++) {
      res[i] = list.get(i);
    }
    return res;
}

以下為python3代碼:

class Solution:
    def levelOrder(self: TreeNode) -> List[int]:
        if not self: return []
        res, queue = [], collections.deque()
        queue.append(self)
        while queue:
            node = queue.popleft()
            res.append(node.val)
            if node.left: queue.append(node.left)
            if node.right: queue.append(node.right)
        return res

if __name__ == '__main__':
    root = TreeNode(1)
    root.left = TreeNode(2)
    print(Solution.levelOrder(root))

解題思路:

  1. 巧妙的利用了隊(duì)列的特性---先進(jìn)先出适刀,將每個(gè)節(jié)點(diǎn)的非空子節(jié)點(diǎn)從左到右存放到隊(duì)列中穷蛹,并遍歷隊(duì)列土陪。題目要求的二叉樹的 從上至下 打印(即按層打与妊)鬼雀,又稱為二叉樹的 廣度優(yōu)先搜索(BFS)。BFS 通常借助 隊(duì)列 的先入先出特性來實(shí)現(xiàn)蛙吏。
  2. 解題思路:
    • 當(dāng)TreeNode為空時(shí)源哩,返回空數(shù)組
    • 將root節(jié)點(diǎn)的TreeNode放入隊(duì)列中,當(dāng)隊(duì)列不為空時(shí)鸦做,獲取隊(duì)列頂端數(shù)據(jù)的值存入數(shù)組中励烦;同時(shí),將非空左節(jié)點(diǎn)和非空右節(jié)點(diǎn)放入隊(duì)列泼诱。利用隊(duì)列先進(jìn)先出的特性坛掠,實(shí)現(xiàn)獲取每個(gè)節(jié)點(diǎn)的val值。

參考題解來源:leetcode

廣度優(yōu)先搜索(BFS):寬度優(yōu)先搜索算法(又稱廣度優(yōu)先搜索)是最簡便的圖的搜索算法之一治筒,這一算法也是很多重要的圖的算法的原型屉栓。Dijkstra單源最短路徑算法和Prim最小生成樹算法都采用了和寬度優(yōu)先搜索類似的思想。其別名又叫BFS耸袜,屬于一種盲目搜尋法系瓢,目的是系統(tǒng)地展開并檢查圖中的所有節(jié)點(diǎn),以找尋結(jié)果句灌。換句話說夷陋,它并不考慮結(jié)果的可能位置,徹底地搜索整張圖胰锌,直到找到結(jié)果為止骗绕。

BFS,其英文全稱是Breadth First Search资昧。 BFS并不使用經(jīng)驗(yàn)法則算法酬土。從算法的觀點(diǎn),所有因?yàn)檎归_節(jié)點(diǎn)而得到的子節(jié)點(diǎn)都會(huì)被加進(jìn)一個(gè)先進(jìn)先出的隊(duì)列中格带。一般的實(shí)驗(yàn)里撤缴,其鄰居節(jié)點(diǎn)尚未被檢驗(yàn)過的節(jié)點(diǎn)會(huì)被放置在一個(gè)被稱為 open 的容器中(例如隊(duì)列或是鏈表)刹枉,而被檢驗(yàn)過的節(jié)點(diǎn)則被放置在被稱為 closed 的容器中。

與BFS相對應(yīng)的是深度優(yōu)先算法屈呕,深度優(yōu)先主要依賴與棧來實(shí)現(xiàn)微宝。

深度優(yōu)先和廣度優(yōu)先的對比:

深度優(yōu)先 廣度優(yōu)先
實(shí)現(xiàn)方式 棧(stack) 隊(duì)列(queue
實(shí)現(xiàn)原理 1、把根節(jié)點(diǎn)壓入棧中虎眨。2蟋软、每次從棧中彈出一個(gè)元素,搜索所有在它下一級的元素嗽桩,把這些元素壓入棧中岳守。并把這個(gè)元素記為它下一級元素的前驅(qū)。3碌冶、找到所要找的元素時(shí)結(jié)束程序湿痢。4、如果遍歷整個(gè)樹還沒有找到扑庞,結(jié)束程序蒙袍。 1、把根節(jié)點(diǎn)放到隊(duì)列的末尾嫩挤。2害幅、每次從隊(duì)列的頭部取出一個(gè)元素,查看這個(gè)元素所有的下一級元素岂昭,把它們放到隊(duì)列的末尾以现。并把這個(gè)元素記為它下一級元素的前驅(qū)。3约啊、找到所要找的元素時(shí)結(jié)束程序邑遏。4、如果遍歷整個(gè)樹還沒有找到恰矩,結(jié)束程序记盒。
整個(gè)過程可以想象成一個(gè)倒立的樹形 整個(gè)過程也可以看做一個(gè)倒立的樹形
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市外傅,隨后出現(xiàn)的幾起案子纪吮,更是在濱河造成了極大的恐慌,老刑警劉巖萎胰,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件碾盟,死亡現(xiàn)場離奇詭異,居然都是意外死亡技竟,警方通過查閱死者的電腦和手機(jī)冰肴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人熙尉,你說我怎么就攤上這事联逻。” “怎么了检痰?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵包归,是天一觀的道長。 經(jīng)常有香客問我攀细,道長,這世上最難降的妖魔是什么爱态? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任谭贪,我火速辦了婚禮,結(jié)果婚禮上锦担,老公的妹妹穿的比我還像新娘俭识。我一直安慰自己,他們只是感情好洞渔,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布套媚。 她就那樣靜靜地躺著,像睡著了一般磁椒。 火紅的嫁衣襯著肌膚如雪堤瘤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天浆熔,我揣著相機(jī)與錄音本辐,去河邊找鬼。 笑死医增,一個(gè)胖子當(dāng)著我的面吹牛慎皱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播叶骨,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼茫多,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了忽刽?” 一聲冷哼從身側(cè)響起天揖,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎跪帝,沒想到半個(gè)月后宝剖,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡歉甚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年万细,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,841評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡赖钞,死狀恐怖腰素,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情雪营,我是刑警寧澤弓千,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站献起,受9級特大地震影響洋访,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜谴餐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一姻政、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧岂嗓,春花似錦汁展、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至公罕,卻和暖如春器紧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背楼眷。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工品洛, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人摩桶。 一個(gè)月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓桥状,卻偏偏與公主長得像,于是被迫代替她去往敵國和親硝清。 傳聞我的和親對象是個(gè)殘疾皇子辅斟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評論 2 354