LeetCode:103.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,null,null,15,7],
3
/ \
9 20
/ \
15 7
return its zigzag level order traversal as:
[
[3],
[20,9],
[15,7]
]

大体的要求跟102差不多,只不过是每层的结点值的顺序要按照Z字形(即第一行从左到右,第二行从右到左,第三行又从左到右……)。

一.我的解法

因为只需要改变顺序,所以我的解法还是跟102差不多,只是多加了一个布尔变量来判定当前的层次的值顺序是从左往右还是从右往左。时间复杂度是O(n),空间复杂度也是O(n)。

class Solution {
    public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
        if(root==null) return new ArrayList<>();
        List<List<Integer>> res=new ArrayList<>();
        Queue<TreeNode> queue=new LinkedList<>();
        boolean zigzag=false;
        queue.offer(root);
        int len=0;
        while(!queue.isEmpty()){
            List<Integer> ls=new ArrayList<>();
            len=queue.size();
            for(int i=0;i<len;i++){
                TreeNode node=queue.poll();
                if(node.left!=null)
                    queue.offer(node.left);
                if(node.right!=null)
                    queue.offer(node.right);
                if(zigzag)
                    ls.add(0,node.val);
                else
                    ls.add(node.val);
            }
            res.add(new ArrayList<Integer>(ls));
            zigzag=!zigzag;
        }
        return res;
    }
}

二.扩展

因为之前102的题目里我发现还有DFS的解法,所以我觉得这道题也必然可以用DFS解决,所以一开始还是打算用布尔变量进行判断是否改变结点值在列表的顺序,后来经过几次失败后,才发现这个方法对DFS遍历是不适用的,因为DFS遍历无法确定一个层级是否遍历完成,所以参考了discussion的解法后才发现还可以利用height%2的余数是否为0来判断。很直接,很简单,可惜一开始我没想到。时间复杂度O(n)。

class Solution{
    List<List<Integer>> res=new ArrayList<>();
    public List<List<Integer>> zigzagLevelOrder(TreeNode root){
        if(root==null) return new ArrayList<>();
        dfs(root,0);
        return res;
    }
    public void dfs(TreeNode root,int height){
        if(root==null) return ;
        addList(root.val,height);
        dfs(root.left,height+1);
        dfs(root.right,height+1);
    }
    public void addList(int val,int height){
        List<Integer> ls;
        if(height>=res.size())
        {
            res.add(new ArrayList<Integer>());
        }
        ls=res.get(height);
        if(height%2!=0)
            ls.add(0,val);
        else
            ls.add(val);
    }
}

这是原地址:
https://discuss.leetcode.com/topic/3413/my-accepted-java-solution

本人还是个菜鸡,所以肯定有错误或者不足的地方,请大家积极指出,我会认真改进的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值