1. 程式人生 > >LeetCode——中級演算法——樹和圖——二叉樹的鋸齒形層序遍歷(JavaScript)

LeetCode——中級演算法——樹和圖——二叉樹的鋸齒形層序遍歷(JavaScript)

給定一個二叉樹,返回其節點值的鋸齒形層次遍歷。(即先從左往右,再從右往左進行下一層遍歷,以此類推,層與層之間交替進行)。

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

    3
   / \
  9  20
    /  \
   15   7

返回鋸齒形層次遍歷如下:

[
  [3],
  [20,9],
  [15,7]
]

思路:

還記得層序遍歷嗎?用一個佇列來實現,先將根節點入佇列,然後當佇列不為空時迴圈,出佇列節點,將這個節點的左右子結點入佇列,直到佇列為空。

本題是鋸齒形,第一層從左往右,第二層從右往左。

因此必須設定一個當前遍歷方向的變數:leftToRight = true(初始為第一行從左往右)
使用棧stack來實現(不得不說JavaScript裡面佇列也好、棧也好,都是陣列而已)。

對於從左往右的層,需要先加左子節點,後加右子節點;對於從右往左,反之,先右後左。

舉例說明:

     1
   /   \
  2     3
 / \   /  \
4   5  6   7  

訪問根節點,此時

儲存節點的佇列  stack = [2, 3]
結果陣列       result = [[1]]
leftToRight = true;

棧先出 3 再出 2,因此 3 的左右子節點必須先右再左,第三層才能以 7、6、5、4 的順序入棧,出棧的順序才能剛好是從左往右的 4、5、6、7。
不多說,看程式碼

/**
 * Definition for a binary tree node.
 * function TreeNode(val) {
 *     this.val = val;
 *     this.left = this.right = null;
 * }
 */
/** * @param {TreeNode} root * @return {number[][]} */ var zigzagLevelOrder = function(root) { if (!root) return []; let leftToRight = true; let stack = []; let result = []; let p = root; stack.push(p) while (stack.length) { let len = stack.length; let temp = []; let result_temp =
[]; while(len) { p = stack.pop(); result_temp.push(p.val); if (leftToRight) { if (p.left) temp.push(p.left) if (p.right) temp.push(p.right) } else { if (p.right) temp.push(p.right) if (p.left) temp.push(p.left) } len--; } stack = temp; leftToRight = !leftToRight; result.push(result_temp) } return result; };