LeetCode103. 二叉树的锯齿形层次遍历

版权声明: https://blog.csdn.net/weixin_40550726/article/details/82768456

给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。

例如:
给定二叉树 [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7

返回锯齿形层次遍历如下:

[
  [3],
  [20,9],
  [15,7]
]

思路:在广度优先遍历过程中,临时存储每一层的值,每隔一次将每一层的值顺序倒置一下即可。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
        
        List<List<Integer>> res=new LinkedList<List<Integer>>();//结果集
        if(null==root){
            return res;
        }
        ArrayDeque<TreeNode> queue=new ArrayDeque<TreeNode>();//辅助数据结构用于遍历树
        queue.add(root);
        int count=0;
        while(!queue.isEmpty()){
            int size=queue.size();
            ArrayDeque<Integer> stack=new ArrayDeque<Integer>(); //临时存储每一层的值
            while(size>0){
                TreeNode node=queue.removeFirst();
                stack.push(node.val);
                if(node.left!=null){
                    queue.add(node.left);
                }
                if(node.right!=null){
                    queue.add(node.right);
                }
                size--;
            }
            if(count%2==0){//判定是否需要反转
                List<Integer> tmp=reverseStack(stack);
                res.add(tmp);
            }else{
                List<Integer> tmp=new LinkedList<Integer>(stack);
                res.add(tmp);
            }
            count++;
        }
        return res;
    }
     /**
     * 反转stack
     * @param stack
     * @return
     */
    public  List<Integer> reverseStack(ArrayDeque<Integer> stack){
        List<Integer> res=new LinkedList<Integer>();
        Object[] a=  stack.toArray();
        for(int i=a.length-1;i>=0;i--){
            res.add((int)a[i]);
        }
        return res;
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_40550726/article/details/82768456