LeetCode——中級演算法——樹和圖——二叉樹的鋸齒形層序遍歷(JavaScript)
阿新 • • 發佈:2018-11-23
給定一個二叉樹,返回其節點值的鋸齒形層次遍歷。(即先從左往右,再從右往左進行下一層遍歷,以此類推,層與層之間交替進行)。
例如:
給定二叉樹 [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;
};