剑指 Offer 32 - III. 从上到下打印二叉树 III + 双端队列使用 + 蛇形打印层次遍历序列 + 正倒序输出

剑指 Offer 32 - III. 从上到下打印二叉树 III

Offer_32_3

题目详情

题解分析

  • 本题我想的比较复杂,其实题目的要求只是需要遍历的结果逆序和正序交替,这个其实可以使用Collections工具类的reverse函数来实现。
  • 这里我根据偶数层和奇数层改变了遍历的顺序,相对较复杂。
package com.walegarrett.offer;

import java.util.*;

/**
 * @Author WaleGarrett
 * @Date 2021/2/1 15:53
 */

/**
 * 题目描述:请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,
 * 第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。
 */
public class Offer_32_3 {
    public List<List<Integer>> levelOrder(TreeNode root) {
        if(root == null)
            return new ArrayList<>();
        List<List<Integer>> list = new ArrayList<>();
        Deque<TreeNode> que = new LinkedList<>();
        que.add(root);
        boolean isOdd = true;//是否是奇数
        while(!que.isEmpty()){
            List<Integer> current = new ArrayList<>();
            Stack<TreeNode> sta = new Stack<>();
            for(int i = que.size(); i> 0; i--){
                TreeNode temp = que.peek();
                que.poll();
                current.add(temp.val);
                if(isOdd){
                    if(temp.left != null) {
                        sta.add(temp.left);
                    }
                    if(temp.right != null) {
                        sta.add(temp.right);
                    }
                }else{
                    if(temp.right != null) {
                        sta.add(temp.right);
                    }
                    if(temp.left != null) {
                        sta.add(temp.left);
                    }
                }
            }
            while(!sta.empty()){
                que.add(sta.pop());
            }
            list.add(current);
            isOdd = !isOdd;//反转遍历方向
        }
        return list;
    }
}
posted @ 2021-02-01 16:44  Garrett_Wale  阅读(99)  评论(0编辑  收藏  举报