按之字形順序打印二叉樹

問題

請實現一個函數按照之字形打印二叉樹,即第一行按照從左到右的順序打印,
第二層按照從右至左的順序打印,第三行按照從左到右的順序打印,其他行以此類推。

算法

在層序遍歷的基礎上進行改進

分析

在這裏插入圖片描述
在這裏插入圖片描述

代碼

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("  ");
        }
    }



}

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