zoukankan      html  css  js  c++  java
  • 【树】Binary Tree Zigzag Level Order Traversal

    题目:

    Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to right, then right to left for the next level and alternate between).

    For example:
    Given binary tree {3,9,20,#,#,15,7},

        3
       / 
      9  20
        /  
       15   7
    

    return its zigzag level order traversal as:

    [
      [3],
      [20,9],
      [15,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) {
        var res=[],tempres=[];
        if(root==null){
            return res;
        }
        var s1=[],s2=[];
        s1.push(root);
        var flag=true;
        
        while(s1.length!=0||s2.length!=0){
            var p=null;
            
            if(flag){
                p=s1.pop();
                tempres.push(p.val);
                if(p.left){
                    s2.push(p.left);
                }
                if(p.right){
                    s2.push(p.right);
                }
                if(s1.length==0){
                    var temp=[];
                    for(var i=0,len=tempres.length;i<len;i++){
                        temp[i]=tempres[i];
                    }
                    res.push(temp);
                    tempres.length=0;
                    flag=false;
                }
            }else{
                p=s2.pop();
                tempres.push(p.val);
                if(p.right){
                    s1.push(p.right);
                }
                if(p.left){
                    s1.push(p.left);
                }
                if(s2.length==0){
                    var temp=[];
                    for(var i=0,len=tempres.length;i<len;i++){
                        temp[i]=tempres[i];
                    }
                    res.push(temp);
                    tempres.length=0;
                    flag=true;
                }
            }
        }
        
        return res;
    };
  • 相关阅读:
    CRM
    eclipse 全局替换
    ps 泡泡
    SSH重新登录的问题
    又说oracle spatial 将Geometry转为gml
    其实你可以这样折腾java enum
    Sqlite 多线程入库
    Oracle spatial 将Geometry转换为gml字符串
    Oracle 关于WKT构造SDO_GEOMETRY的问题。
    Lucene之拉框查询
  • 原文地址:https://www.cnblogs.com/shytong/p/5184419.html
Copyright © 2011-2022 走看看