(Java 剑指 offer)把二叉树打印成多行

一、题目解析

从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。

题目要求按行输出节点,由于是从左到右,所以首先想到是队列,符合先进先出,但是需要注意如何判断每一行输出了全部,所以就需要在每一行加一个空值,表示该行的行尾

二、代码

 ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {
    
    
        if (pRoot == null) {
    
    
            return null;
        }
        ArrayList<ArrayList<Integer>> lists = new ArrayList<>();
        //linkedlist 初始化队列
        LinkedList<TreeNode> linkedList = new LinkedList<>();
        //加入第一行,也就是头结点
        linkedList.add(pRoot);
        //使用一个空值表示第一行的结尾
        linkedList.add(null);
        //根据插入的空值判断是否到了行尾
        while (linkedList.peek() != null) {
    
    
            ArrayList<Integer> list = new ArrayList<>();
            //找到并删除链表的头
            TreeNode poll = null;
            poll = linkedList.poll();
            //将下一行的节点全部入队列,根据空值判断是否到达了行尾
            while (poll != null) {
    
    
                list.add(poll.val);
                if (poll.left != null) {
    
    
                    linkedList.add(poll.left);
                }
                if (poll.right != null) {
    
    
                    linkedList.add(poll.right);
                }
                //对首元素继续出队
                poll = linkedList.poll();
            }
            //行尾的 null 出队
            linkedList.poll();
            //扫描完一行,加一个null
            linkedList.add(null);
            lists.add(list);
        }
        return lists;
    }

三、总结

(1)LinkedList 实现了 List接口,也实现了 Queue 接口(队列操作接口,FIFO先进先出)

//linkedlist 初始化队列
LinkedList<TreeNode> linkedList = new LinkedList<>();

(2)peek 方法:找到但不删除链表的头

linkedList.peek() != null

(3)poll 找到并删除此链表的头

poll = linkedList.poll();

猜你喜欢

转载自blog.csdn.net/nanhuaibeian/article/details/108807763