• 剑指Offer——按之字形顺序打印二叉树


    1、题目描述

      请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。

    2、代码实现

    import java.util.ArrayList;
    
    /*
    public class TreeNode {
        int val = 0;
        TreeNode left = null;
        TreeNode right = null;
    
        public TreeNode(int val) {
            this.val = val;
    
        }
    
    }
    */
    import java.util.ArrayList;
    import java.util.LinkedList;
    public class Solution {
        public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
            ArrayList<ArrayList<Integer>> listAll = new ArrayList<>();
            ArrayList<Integer> list = new ArrayList<>();
            if (pRoot == null) {
                return listAll;
            }
            LinkedList<TreeNode> queue = new LinkedList<>();
            int count = 1;
            int start = 0;
            //用于记录树中每一层的节点个数,当start==end的时候,表示当前层的节点已经全部添加进临时链表list中
            int end = 1;
            queue.add(pRoot);
            while (!queue.isEmpty()) {
                TreeNode temp = queue.pop();
                list.add(temp.val);
                start++;
                //这里必须是先把temp节点的左右子节点加进队列之后再去判断start是否和end相等,因为相等之后赋值的时候
                //需要把当前队列的长度赋值给end
                if (temp.left != null) {
                    queue.add(temp.left);
                }
                if (temp.right != null) {
                    queue.add(temp.right);
                }
                //当start==end的时候,表示当前层的节点已经全部添加进临时链表list中,需要把临时链表添加进listAll中
                //并且还要把end重新赋值为下一层的节点总个数值
                if (start == end) {
                    if ((count & 1) == 0) {
                        end = queue.size();
                        start = 0;
                        ArrayList<Integer> list_temp = reverse(list);
                        listAll.add(list_temp);
                        list = new ArrayList<>();
                        
                    } else {
                        end = queue.size();
                        start = 0;
                        listAll.add(list);
                        list = new ArrayList<>();
                    }
                    count++;
                }
            }
            return listAll;
        }
         private ArrayList<Integer> reverse(ArrayList<Integer> list) {
            if (list.size() == 0) {
                return null;
            }
            ArrayList<Integer> temp = new ArrayList<>();
            for (int i = list.size() - 1; i >= 0; i--) {
                temp.add(list.get(i));
            }
            return temp;
        }
    }
    

      

  • 相关阅读:
    Excel 2016 Power View选项卡不显示的问题
    Base64编码
    MAPI错误0x80040107
    命令行界面 (CLI)、终端 (Terminal)、Shell、TTY的区别
    C函数调用过程原理及函数栈帧分析
    SIFT(Scale-invariant feature transform) & HOG(histogram of oriented gradients)
    Jupyter NoteBook 的快捷键
    endnote插入参考文献后的对齐方式和缩进空格
    赏月斋源码共享计划 第四期 约瑟夫问题
    LRU和LFU的区别
  • 原文地址:https://www.cnblogs.com/BaoZiY/p/11183678.html
Copyright © 2020-2023  润新知