Java同学的面试算法学习 8

49 阅读1分钟

按之字形顺序打印二叉树

题目描述

image-20240112215607949

image-20240112215614106

思路

使用一个队列来进行记录每一层的结点,再使用一个一维整数集合来记录val,使用一个boolean的flag标记,奇数层不反转集合,偶数层反转集合

代码

import java.util.*;

/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 *   public TreeNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param pRoot TreeNode类
     * @return int整型ArrayList<ArrayList<>>
     */
    ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
    public ArrayList<ArrayList<Integer>> Print (TreeNode pRoot) {
        // write code here
        //头结点为空直接返回
        if (pRoot == null) {
            return res;
        }

        Queue<TreeNode> queue = new LinkedList<TreeNode>();
        queue.offer(pRoot);
        boolean flag = false; //false表示奇数层不用逆转集合

        while (!queue.isEmpty()) {
            GetFormatRes(queue, flag);
            flag = !flag;
        }
        return res;
    }
    //得到之字形的的数据记录
    private void GetFormatRes(Queue<TreeNode> queue, boolean flag) {
        ArrayList<Integer> row = new ArrayList<Integer>();
        int n = queue.size();
        for (int i = 0; i < n; i++) {
            HandleCurrentTreeNodes(row, queue);
        }
        if (flag) {
            Collections.reverse(row);
        }
        res.add(row);

    }
    //将队列记录当前层的结点值放入一维集合中,并将下一层的结点记录入队列
    private void HandleCurrentTreeNodes(ArrayList<Integer> row,
                                        Queue<TreeNode> queue) {
        TreeNode temp = queue.poll();
        row.add(temp.val);
        if (temp.left != null) {
            queue.offer(temp.left);
        }
        if (temp.right != null) {
            queue.offer(temp.right);
        }
    }
}

总结

慢慢地需要将写的代码更加单元化,但是在方法命名上还是不行,可能是概括能力不行,慢慢锻炼吧:smile: