zoukankan      html  css  js  c++  java
  • 之字形打印二叉树—Java

    给定一颗二叉树,逐层打印,并且每层打印的方向是不一样的,比如:

    逐层打印的结果是:
    1

    3 2

    4 5 6

    8 7

    代码

    import java.util.ArrayList;
    import java.util.Stack;
    
    public class Main {
        
        public static class TreeNode {
            public int val;
            public TreeNode left;
            public TreeNode right;
            
            public TreeNode(int val) {
                this.val = val;
            }
        }
        
        public static ArrayList<ArrayList<Integer>> printZigZag(TreeNode head) {
            if(head == null) {
                return null;
            }
            
            Stack<TreeNode> s1 = new Stack<>();
            Stack<TreeNode> s2 = new Stack<>();
    
            ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
            
            s1.push(head);
            
            
            while(!s1.isEmpty() || !s2.isEmpty()) {
                if(!s1.isEmpty()) {
                    ArrayList<Integer> arr1 = new ArrayList<>();
                    while(!s1.isEmpty()) {
                        TreeNode t1 = s1.pop();
                        arr1.add(t1.val);
                        
                        //注意,一定要保证你插入到栈中的值不为空
                        if(t1.left!=null) {
                            s2.push(t1.left);
                        }
                        
                        if(t1.right!=null) {
                            s2.push(t1.right);
                        } 
                    }
                    
                    res.add(arr1);
                } else if(!s2.isEmpty()){
                    ArrayList<Integer> arr2 = new ArrayList<>();
                    while(!s2.isEmpty()) {
                        TreeNode t2 = s2.pop();
                        arr2.add(t2.val);
                        
                        if(t2.right!=null) {
                            s1.push(t2.right);
                        } 
                        
                        if(t2.left!=null) {
                            s1.push(t2.left);
                        }
                        
                    }
                    
                    res.add(arr2);
                } 
            }
            
            return res;
        }
        
        public static void main(String[] args) {
            TreeNode head = new TreeNode(1);
            head.left = new TreeNode(2);
            head.right = new TreeNode(3);
            head.left.left = new TreeNode(4);
            head.right.left = new TreeNode(5);
            head.right.right = new TreeNode(6);
            head.right.left.left = new TreeNode(7);
            head.right.left.right = new TreeNode(8);
    
            ArrayList<ArrayList<Integer>> res = printZigZag(head);
    
            for(int i=0; i<res.size(); i++) {
                ArrayList<Integer> res1 = res.get(i);
                for(int j=0; j<res1.size(); j++) {
                    System.out.print(res1.get(j)+" ");
                }
                System.out.println();
            }
        }
    }
  • 相关阅读:
    R语言:常用统计检验
    用R语言的quantreg包进行分位数回归
    使用adagio包解决背包问题
    手机上的微型传感器
    JS常用字符串、数组的方法(备查)
    Threejs 纹理贴图2--凹凸贴图、法线贴图
    Three.js 纹理贴图1--旋转的地球
    Three.js 帧动画
    Three.js光源、相机知识梳理
    Three.js 点、线、网络模型及材质知识梳理
  • 原文地址:https://www.cnblogs.com/loren-Yang/p/7535577.html
Copyright © 2011-2022 走看看