難度:簡單node
涉及知識:樹、廣度優先搜索es6
題目地址:https://leetcode-cn.com/problems/binary-tree-level-order-traversal-ii/數組
題目內容:bash
給定一個二叉樹,返回其節點自底向上的層次遍歷
(即從葉子節點所在層到根節點所在層,逐層從左到右遍歷,整體以數組形式呈現,每層以子數組形式呈現)
e.g.
給定一個二叉樹[3,9,20,null,null,15,7]
圖形呈現:
3
/ \
9 20
/ \
15 7
返回自底向上遍歷該二叉樹的數組:
[
[15,7],
[9,20],
[3]
]
複製代碼
題目給定用例:[3,9,20,null,null,15,7]
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* @param {TreeNode} root
* @return {number[][]}
*/
由編輯器頂部給定的形式,可判斷二叉樹root的結構爲
輸入方法的參數root,即測試用例以下:
let root = {
val: 3,
left: {
val: 9, left: null, right: null
},
right: {
val: 20,
left: {
val: 15, left: null, right: null
},
right: {
val: 7, left: null, right: null
}
}
};複製代碼
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* @param {TreeNode} root
* @return {number[][]}
*/
var levelOrderBottom = function (root) {
if (!root) {
return [];//輸入的方法root爲空,則表明這是個空的二叉樹
}
let result = [];
//遍歷root的方法,depth表示遍歷到二叉樹的哪一層,初始時候爲0(即第一層),運行後在方法內進行自增
let showList = function (root, depth) {
if (!root || root.val == null) {
return; //輸入的二叉樹節點爲空,或節點值爲空
}
//查找本層級是否已經有遍歷
if (!result[depth]) {
result[depth] = [];//若是沒有被遍歷則初始化該層爲一個數組,其中一個層級理解爲一個子數組
}
result[depth] = [root.val,...result[depth]
]
;//此處爲es6擴展符寫法,意爲將root.val推入result[depth]原有項
depth += 1;
showList(root.right, depth);//因爲是遍歷的val值插入同層級子數組的最前一項,因此要先遍歷right子節點,才能造成最後左節點在右節點前項
showList(root.left, depth);
};
showList(root, 0);
return result.reverse();//因爲題目要求是從底層往頂層輸出遍歷結果,則只須要reverse處理便可
};
複製代碼
遍歷順序爲:3,20,7,15,9 而後依次插入對應層級depth的子數組
複製代碼
depth在方法中既表示層級,也表示層級對應的子數組編號,在遍歷結果result中充當對應關係。複製代碼