美文网首页
从上往下打印二叉树

从上往下打印二叉树

作者: 囧略囧 | 来源:发表于2019-06-22 16:15 被阅读0次

题目描述

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

这道题目为遍历二叉树,但是与常见的前序、中序和后序遍历不同,为层次遍历。

image

理想的输出应为A、B、C、D、E、F、G

具体方法为:

首先打印A,然后将B、C存入容器,(容器中:B、C)

然后取B,将D、E存入容器,(容器中:C、D、E)

再取C,将F、G存入容器,(容器中:D、E、F、G)

再取D,因为D没有子节点,所以不存,(容器中:E、F、G)

再取E,因为E没有子节点,所以不存,(容器中:F、G)

再取F,因为F没有子节点,所以不存,(容器中:G)

再取G,因为G没有子节点,所以不存,(容器中:空)

由上述过程我们可以发现使用队列可以很好地完成。

附上代码

import java.util.Queue;
import java.util.ArrayList;
public class Solution {
    public static ArrayList PrintFromTopToBottom(TreeNode root) {
           ArrayList result = new ArrayList();
               Queue queue = new LinkedList();
               if(root == null) return result;
               queue.offer(root);
               while(!queue.isEmpty()) {
                     TreeNode now = queue.remove();
                     result.add(now.val);
                     if(now.left != null)
                        queue.offer(now.left);
                     if(now.right != null)
                        queue.offer(now.right);
               }
               return result;    
    }  
}

针对Queue,额外补充一点知识。

offer()和add()的区别:
一些队列有大小限制,因此如果想在一个满的队列中加入一个新项,多出的项就会被拒绝。
这时新的offer()方法就可以起作用了。调用add()方法会抛出一个 unchecked 异常,而offer()方法只是返回 false。

poll()和remove()的区别:
remove() 和 poll() 方法都是从队列中删除第一个元素。remove() 的行为与 Collection 接口的版本相似,
但是新的 poll() 方法在用空集合调用时不是抛出异常,只是返回 null。因此新的方法更适合容易出现异常条件的情况。

peek()和element()的区别:
element() 和 peek() 用于在队列的头部查询元素。与 remove() 方法类似,在队列为空时, element() 抛出一个异常,而 peek() 返回 null。

相关文章

网友评论

      本文标题:从上往下打印二叉树

      本文链接:https://www.haomeiwen.com/subject/wskvqctx.html