LeetCode Binary Tree Zigzag Level Order Traversal

54 篇文章 0 订阅
32 篇文章 0 订阅

原题链接在这里:https://leetcode.com/problems/binary-tree-zigzag-level-order-traversal/

这道题是BFS的变形,与Binary Tree Level Order Traversal相似。但是要求偶数行从左到右,奇数行从右到左。

这种顺序正反交替可以用两个stack来实现。一个用来读取,一个用来存储下一层节点。

Time O(n), Space O(n).

Note: 1. 内层loop表示一行,每当一行走完,stk就会变为空,stk需更新成newStk. 外层loop是走完整个树。所以level不要忘记在外层loop更新。

2. 只有当ls.size()>0时,外层loop才会把ls加到res里,如果没有这个限定条件的话会在最后加上一个空的ls到res里。

AC Java:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
        List<List<Integer>> res = new ArrayList<List<Integer>>();
        if(root == null){
            return res;
        }
        List<Integer> ls = new ArrayList<Integer>();
        Stack<TreeNode> stk = new Stack<TreeNode>();
        stk.push(root);
        ls.add(root.val);
        res.add(ls);
        int level = 1;
        while(!stk.empty()){
            Stack<TreeNode> newStk = new Stack<TreeNode>();
            ls = new ArrayList<Integer>();
            
            while(!stk.empty()){
                TreeNode tn = stk.pop();
                if(level%2 == 0){
                    if(tn.left != null){
                        ls.add(tn.left.val);
                        newStk.push(tn.left);
                    }
                    if(tn.right != null){
                        ls.add(tn.right.val);
                        newStk.push(tn.right);
                    }
                }else{
                    if(tn.right != null){
                        ls.add(tn.right.val);
                        newStk.push(tn.right);
                    }
                    if(tn.left != null){
                        ls.add(tn.left.val);
                        newStk.push(tn.left);
                    }
                }
            }
            level++;
            if(ls.size()>0){ //error
                 res.add(ls); 
            }
            stk = newStk;
        }
        return res;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值