您的位置:首页 > Web前端

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

MuNaiTao 2020-03-15 18:24 49 查看 https://blog.csdn.net/munaitao

从上往下打印二叉树

题目描述

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

题解思路


按照题意打印顺序为从上到下,从左到右 8 6 10 5 7 9 11
那么就是可以用一个队列来存储结点。
访问到一个节点,如果该节点有左子节点或者右子节点,就把左子节点和右子节点加入到队列的尾部。从队列的头部开始将节点出队并加给arrarylist,重复这个步骤。直到队列结束。

队列是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作。

LinkedList类实现了Deque接口,Deque接口实现Queue接口,因此我们可以把LinkedList当成Queue来用。

Queue的方法:
offer 和add:
offer()在添加失败时,会返回false,而add()在加入队列失败时。抛出unchecked异常。因为一些队列有大小限制,因此如果想在一个满的队列中加入一个新项,多出的项就会被拒绝
poll和remove:
都是删除队列的第一个元素,但是poll方法在用空集合调用的时候,不会抛出异常,只是会返回一个null,而remove则会抛出异常
peek,element区别:
element() 和 peek() 用于在队列的头部查询元素。与 remove() 方法类似,在队列为空时, element() 抛出一个异常,而 peek() 返回 null。

代码

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;

/**
* @Author liuhaoqi
* @Date 2020/3/2 19:31
* @Version 1.0
*/
public class Jianzhioffer23 {
public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) {
//访问到一个结点,如果该结点有子结点,那么就把它的子结点按左子结点到右子结点顺序加入队列的尾部
//然后对队列的头部将最早进入队列的结点放到arraylist中,重复这个操作,直到队列中所有结点都存到arraylist中
ArrayList<Integer> list = new ArrayList<Integer>();
//使用到queue
Queue<TreeNode> queue=new LinkedList<TreeNode>();
if (root==null) {
return list;
}
//先将根节点加入队列
queue.offer(root);
//遍历队列,直到队列为空
while (!queue.isEmpty()) {
//加到list中
TreeNode tempNode=queue.poll();
list.add(tempNode.val);
//如果该节点有左子节点或者右子节点,就将它们加入到队列的尾部
if (tempNode.left!= null ) {
queue.offer(tempNode.left);
}
if (tempNode.right!=null) {
queue.offer(tempNode.right);
}
}
//得到了一个list结果,将其返回
return list;
}
}
  • 点赞
  • 收藏
  • 分享
  • 文章举报
MuNaiTao 发布了13 篇原创文章 · 获赞 0 · 访问量 243 私信 关注
标签: