题目描述
从上往下打印出二叉树的每个节点,同层节点从左至右打印。
示例1
输入:{5,4,#,3,#,2,#,1}
返回值:[5,4,3,2,1]
题目分析
要求二叉树“从上往下”打印(即按层打印),又称为二叉树的广度优先搜索(BFS)。
如示例1:{5,4,#,3,#,2,#,1}
从上往下遍历结果为:5,4,3,2,1
解题思路
树的BFS遍历通常使用“队列”的先入先出特性来实现
1.将头结点放入队列中;
2.从队列头中取出一个结点,将这个结点的值放入遍历结果list中,且将它不为空的子节点依次放到队尾(这样可以保证子节点的访问顺序是从左到右);
3.重复2,直到队列为空,即二叉树遍历完成。
具体过程如下图:例子{5,4,3,#,2,1,#}
代码实现
public ArrayList<integer> PrintFromTopToBottom(TreeNode root) { // 存储结果 ArrayList<integer> result = new ArrayList<integer>(); if(root == null) return result; // 借助队列,保存数据,广度遍历树 Queue<treenode> queue = new LinkedList<treenode>(); // 1.放入头结点 queue.offer(root); while(!queue.isEmpty()){ // 2.取出队列头部结点 TreeNode temp = queue.poll(); if(temp.left != null){ // 3.结点左节点不为空,放入队列尾部 queue.offer(temp.left); } if(temp.right != null){ // 4.结点右节点不为空,放入队列尾部 queue.offer(temp.right); } // 5.获得结点值 result.add(temp.val); } return result; }
时间复杂度:O(N),需要遍历整个树;
空间复杂度:队列中存储的子节点最多为N/2(平衡树),O(N);
扩展
若是要求打印结果,同层要从右往左打印,应该如何修改实现?
答:只要在判断结点的左右子节点是否为空的情况下,先判断右节点,再判断左节点,则同一层的结点访问顺序为“从右到左”。