剑指Offer-二叉树-(12)

知识点/数据结构:二叉树

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

注意点

观察数据容器中赛数据的过程

import java.util.ArrayList;
import java.util.Stack;
import java.util.LinkedList;
/*
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}
*/
//和上个题的区别,换了数据结构,也就是数据的容器。
public class Solution {
   public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
        //先定义一个存放返回值的容器
        ArrayList<ArrayList<Integer>> ret = new ArrayList<>();
        
        //这个容器是存放某一次 某一行的所有数据
        ArrayList<Integer> tmp = new ArrayList<Integer>();
        
        //来敲黑板,划重点。用链表来实现队列从左到右的输出
        LinkedList<TreeNode> q = new LinkedList<>();
        
        if(pRoot == null) return ret;
        
        
        //是每次的一个更新,就是第一次的已经放到了目标容器中,下一次会填充几个元素
        //《剑指offer》这里的next就是用来跟踪的。
        q.add(pRoot);
        int now = 1, next = 0;//now表示的是这一行有几个元素,因为第一次填充一个元素,所以初始值是1。
        while(!q.isEmpty()) {
            //这里就是应该删除链表的第一个节点;同时也把数据保存到了t中。
            TreeNode t = q.removeFirst();//删除一个节点,立马需要把输出的节点的内容放到链表中。这里借助链表可以删除头元素的性质。
            tmp.add(t.val);    //添加到数组中,用来打印
            now--;//从这里可以看出now表示队列中的元素个数
             
            if(t.left != null) {
                q.add(t.left);
                next++;
            }
            if(t.right != null) {
                q.add(t.right);
                next++;
            }
            //此时此刻,需要等到next--操作数次后,直到达到所在行的最后一列。
            if(now == 0) {
                ret.add(new ArrayList<Integer>(tmp));
                
                tmp.clear();//Clear方法用于清除现有所有的元素  
                now = next;//这里告诉now下一行需要打印几个元素。然后在下一次while循环的时候
                //就可以判断什么时候进入这个if循环。
                
                next = 0;//变为0是为了从左到右继续重新计数下一次添加了几个元素
            }
        }
        return ret;
    }
    
}

猜你喜欢

转载自blog.csdn.net/qq_35649064/article/details/84891620