103 Binary Tree Zigzag Level Order Traversal

二叉树的Z字形层序遍历

BFS层序遍历,非递归实现,偶数行进行反转,faster than 13%

/**
 * 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) {
    var res = []
    var queue = []
    if (root === null) return res
    queue.push(root)
    while (queue.length){
        var sub = []
        var n = queue.length
        for (var i = 0; i < n; i++){
            var node = queue.shift()
            sub.push(node.val)
            if (node.left !== null) queue.push(node.left)
            if (node.right !== null) queue.push(node.right)
        }
        if(res.length % 2 === 0)res.push(sub)
        else res.push(sub.reverse())
    }
    return res
};

维护两个栈,faster than 25%
根据栈后进先出,维护两个栈,相邻两行分别存到两个栈中,一个栈先进左子节点然后右子节点,另一个栈先进右子节点然后左子节点。比如第二层,从左至右入栈,逆序出栈,那么第三层就是从右至左入栈,第四层就是从左至右入栈。

var zigzagLevelOrder = function(root) {
    var res = []
    if (root === null) return res
    var stack1 = []
    var stack2 = []
    stack1.push(root)
    var sub = []
    while(stack1.length || stack2.length){
        sub = []
        while(stack1.length !== 0){
            var node = stack1.pop()
            if(node !== null) {
                sub.push(node.val)
                if(node.left !== null) stack2.push(node.left)
                if(node.right !== null) stack2.push(node.right)
            }
        }
        if(sub.length !== 0) res.push(sub)
        sub = []
        while(stack2.length !== 0){
            var node = stack2.pop()
            if(node !== null){
                sub.push(node.val)
                if(node.right !== null) stack1.push(node.right)
                if(root.node !== null) stack1.push(node.left)
            }
        }
        if(sub.length !== 0) res.push(sub)       
    }
    return res  
};

递归实现,faster than 30%

var zigzagLevelOrder = function(root) {
    var res = []
    recursive(root, 0, res)
    return res
};
var recursive = function(root, level, res){
    if (root === null) return 
    if (res[level]){
        if (level % 2 === 1) res[level].unshift(root.val)
        else res[level].push(root.val)
    }else{
        res[level] = [root.val]
    }
    recursive(root.left, level + 1, res)
    recursive(root.right, level + 1, res)
}

你可能感兴趣的:(103 Binary Tree Zigzag Level Order Traversal)