按之字形顺序打印二叉树

问题

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

算法

在层序遍历的基础上进行改进

分析

在这里插入图片描述
在这里插入图片描述

代码

package ATree;


import java.util.*;

/**
 * @Author Zhou  jian
 * @Date 2020 ${month}  2020/3/13 0013  17:54
 * 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,
 * 第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。

 */
public class Problem4 {

    //层序遍历
    public void level(TreeNode pRoot){
        Queue<TreeNode> queue = new ArrayDeque<>();

        //先实现层序遍历
        TreeNode temp = pRoot;
        queue.add(temp);
        while(queue.size()!=0){
            temp = queue.poll();
            if(temp.left!=null){
                queue.add(temp.left);
            }
            if(temp.right!=null){
                queue.add(temp.right);
            }
            System.out.println(temp.val);

        }


    }


    //Z子姓打印
    public ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {

        ArrayList<ArrayList<Integer>> result = new ArrayList<>();
        //true表示奇数层,false表示偶数层
        boolean flag = true;

        Queue<TreeNode> queue = new ArrayDeque<>();
        queue.add(pRoot);

        while(queue.size()!=0){
            //计算此时队列的长度以此计算需要取出的数据个数
            int len = queue.size();
            ArrayList<Integer> arrayList =new ArrayList<>();
            TreeNode treeNode = null;
            for(int i=0;i<len;i++){
                treeNode = queue.poll();
                if(treeNode.left!=null){
                    queue.add(treeNode.left);
                }
                if(treeNode.right!=null){
                    queue.add(treeNode.right);
                }
                arrayList.add(treeNode.val);
            }

            if(!flag){//反序取数据
                Collections.reverse(arrayList);
            }
            //更换奇偶层标志
            flag = !flag;
            result.add(arrayList);
        }

        return result;

    }

    public static void main(String[] args) {

        TreeNode A = new TreeNode(1);
        TreeNode B = new TreeNode(2);
        TreeNode C = new TreeNode(3);
        TreeNode D = new TreeNode(4);
        TreeNode E = new TreeNode(5);
        TreeNode G = new TreeNode(6);
        TreeNode H = new TreeNode(7);
        TreeNode I = new TreeNode(8);


        A.left=B;
        A.right=C;
        B.left=D;
        C.left=E;
        C.right=G;
        D.right=H;
        G.left=I;

        Problem4 problem4 = new Problem4();
//        problem4.Print(A);

        ArrayList<ArrayList<Integer>> result = problem4.Print(A);
        for(ArrayList<Integer> t:result){
            for(Integer re:t){
                System.out.print(re+"   ");
            }
            System.out.println("  ");
        }
    }



}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章