1. 程式人生 > 實用技巧 >(LeetCode一刷)二叉樹的鋸齒形層次遍歷

(LeetCode一刷)二叉樹的鋸齒形層次遍歷

注:個人演算法比較菜,由於是第一遍刷題,程式碼質量可能都不好,這裡暫時做個刷題記錄:)。

題目:

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

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

作者:力扣 (LeetCode)
連結:https://leetcode-cn.com/leetbook/read/top-interview-questions-medium/xvle7s/
來源:力扣(LeetCode)
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。

圖解:

                 1
              /     \
            
2 3 / \ / \ 4 5 6 7
init two array: larr [1] rarr []
larr rarr visit node [
1] [] [] [2, 3] 1 [6,7] [2] 3 [4,5,6,7] [] 2 [5,6,7] [] 4 ... [] ...

程式碼:

function TreeNode(val){
     this.val = val;
     this.left = this.right = null;
}

/**
 *層次遍歷構造二叉樹
 */
function createBinaryTree(arr){
    var p = new TreeNode(arr[0]);
    var k = 0;
    var len = arr.length;
    var buildTree = function(node, i){
       if(2*i+1<len && arr[2*i+1]!==null
){ node.left = new TreeNode(arr[2*i+1]); node.left && buildTree(node.left, 2*i+1) } if(2*i+2<len && arr[2*i+2]!==null){ node.right = new TreeNode(arr[2*i+2]); node.right && buildTree(node.right, 2*i+2); } }; buildTree(p, 0); return p; } /** * @param {TreeNode} root * @return {number[][]} */ var zigzagLevelOrder = function(root) { if(!root) return []; var flag = true; var result = []; var larr = [root]; var rarr = []; var p = null; var tmp = []; while(larr.length>0||rarr.length>0){ if(flag){ tmp = []; while(larr.length>0){ p = larr.shift(); p && tmp.push(p.val); var tmp2 = []; p.left && tmp2.push(p.left); p.right && tmp2.push(p.right); rarr = rarr.concat(tmp2); } result.push(tmp); }else{ tmp = []; while(rarr.length>0){ p = rarr.pop(); p && tmp.push(p.val); var tmp2 = []; p.left && tmp2.push(p.left); p.right && tmp2.push(p.right); larr = tmp2.concat(larr); } result.push(tmp); } flag=!flag; } return result; }; var arr = [3,9,20,null,null,15,7]; var tree = createBinaryTree(arr); //console.log(tree); //var tree = new TreeNode(1); var result = zigzagLevelOrder(tree); console.log('result',result);