剑指offer-从上往下打印二叉树

题目描述:

从上往下打印出二叉树的每个节点,同层节点从左至右打印。

思路:

​ 直接用队列做个层序遍历就行了

​ 这牛客网天天就WA在空数据上面,emmm,一开始我判断root为null直接返回null,结果要返回空list.

code

public static ArrayList<Integer> PrintFromTopToBottom(TreeNode root) {
    ArrayList<Integer> list=new ArrayList<>();
    if(root==null) {
        return list;
    }
    Queue<TreeNode> queue=new LinkedList<>();
    queue.offer(root);
    while(!queue.isEmpty()) {
        list.add(queue.peek().val);
        if(queue.peek().left!=null) {
            queue.offer(queue.peek().left);
        }
        if(queue.peek().right!=null) {
            queue.offer(queue.peek().right);
        }
        queue.poll();
    }
    return list;
}

拓展一

​ 剑指offer上提出新问题,要求分层打印二叉树.

思路:

​ 要想办法知道当前层有多少结点要打印

​ 因此,做法就是设置print标记当前层要打印的结点数量,每打印一个,print–,当print为0时,表示这层打印完

​ 同时要设置next标记下一层结点个数,每插入一个子结点,next++

​ 当print为0时,将next赋值print,next置0,开始下一层

拓展二

​ 剑指offer上又提出新问题,要求之字形打印.即一层正序打印,一层逆序打印.

思路:

​ 做法同拓展一,再添加一个新标记cnt,记录当前在第几层.当每次print为0时,cnt++

​ 若当前层为奇数层,则正常打印

​ 若当前层为偶数层,则先将需要打印的元素入栈,在该层结束时,做个出栈打印