1. 程式人生 > 其它 >【leecode 劍指 Offer】從上到下列印二叉樹 III

【leecode 劍指 Offer】從上到下列印二叉樹 III

技術標籤:TypeScriptleecode演算法二叉樹

從上到下列印二叉樹 III

題目

請實現一個函式按照之字形順序列印二叉樹,即第一行按照從左到右的順序列印,第二層按照從右到左的順序列印,第三行再按照從左到右的順序列印,其他行以此類推。

示例

例如:
給定二叉樹: [3,9,20,null,null,15,7],
在這裡插入圖片描述
返回其層次遍歷結果:
在這裡插入圖片描述

解題思路

演算法流程:

  1. BFS 迴圈: 迴圈列印奇 / 偶數層,當 queue 為空時跳出;
  2. 列印奇數層: 從左向右 列印,先左後右 加入下層節點;
  3. 若 queue 為空,說明向下無偶數層,則跳出;
  4. 列印偶數層: 從右向左 列印,先右後左 加入下層節點;

演算法實現

/**
 * Definition for a binary tree node.
 * function TreeNode(val) {
 *     this.val = val;
 *     this.left = this.right = null;
 * }
 */
/**
 * @param {TreeNode} root
 * @return {number[][]}
 */
var levelOrder = function(root) {
    // 當子樹為空時返回空
    if(!root){
        return [];
    }
    // 記錄結果
    let
res = []; // 記錄每層節點數 let tmp = []; // 輔助佇列 let queue = [root]; // 單雙層標記 let flag =true; // 當輔助佇列不為空時遍歷 while(queue.length !==0) { //清空臨時陣列列表 tmp = [] // 記錄當層節點數量 var length =queue.length; // 遍歷當層節點 while(length--){ let first =
queue.shift(); tmp.push(first.val); if(first.left){ queue.push(first.left) } if(first.right){ queue.push(first.right) } } // 當層數為單層時壓入結果中,否則翻轉後壓入結果中 if(flag){ res.push(tmp) }else{ res.push(tmp.reverse()) } // 層數單雙切換 flag=!flag; } // 返回結果 return res; };