zoukankan      html  css  js  c++  java
  • 剑指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;
        }
    }
    

      

  • 相关阅读:
    python 基础知识(一)
    挖坑和打井的思考
    静坐冥想
    恭喜你被裁员了!
    什么叫做内心强大?怎样变成一个内心强大的人?
    年轻人,你的时间到哪啦?
    树莓派3B+ 人脸识别、摄像头安装和使用
    树莓派3b+ 实现视频监控
    如何设置树莓派 VNC 的分辨率
    为什么大多数托管辅导班做不大?
  • 原文地址:https://www.cnblogs.com/BaoZiY/p/11183678.html
Copyright © 2011-2022 走看看