欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程语言 > java >内容正文

java

剑指Offer(Java实现)把二叉树打印成多行

发布时间:2025/4/16 java 41 豆豆
生活随笔 收集整理的这篇文章主要介绍了 剑指Offer(Java实现)把二叉树打印成多行 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

题目描述

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

解题思路

利用辅助空间链表或队列来存储节点,每层输出。

代码实现

import java.util.ArrayList; 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 {ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {ArrayList<ArrayList<Integer>> res = new ArrayList<>();if (null == pRoot) {return res;}LinkedList<TreeNode> queue = new LinkedList<>();queue.offer(pRoot);ArrayList<Integer> list = new ArrayList<>();int start = 0;int end = 1;while (!queue.isEmpty()) {TreeNode node = queue.pop();start++;list.add(node.val);if (null != node.left) {queue.offer(node.left); // 也可用 queue.add(node.left);}if (null != node.right) {queue.offer(node.right); // 也可用 queue.add(node.right);}if (start == end) {start = 0;end = queue.size();res.add(new ArrayList<>(list));list.clear();}}return res;} }

注意

if (start == end) {start = 0;end = queue.size();res.add(new ArrayList<>(list));list.clear(); }

start 用于记录当前节点在其所在层中的位置;end 用于记录当前节点所在层的节点个数。

当 start == end 时,则说明当前层的节点都以记录完成,存入ArrayList中;此时,需要将start重新设为0,而且,当前队列中剩余元素皆为下一层中的节点,故需要将end设置为 queue.size(),并清除list,等待下一次遍历的节点存储。

if (null != node.left) {queue.offer(node.left); // 也可用 queue.add(node.left); } if (null != node.right) {queue.offer(node.right); // 也可用 queue.add(node.right); }

offer属于 offer in interface Deque<E>,add 属于 add in interface Collection<E>。

当队列为空时候,使用add方法会报错,而offer方法会返回false。

作为List使用时,一般采用add / get方法来 压入/获取对象。

作为Queue使用时,才会采用 offer/poll/take等方法作为链表对象时,offer等方法相对来说没有什么意义这些方法是用于支持队列应用的。

总的上来说,add() 与 offer() 基本情况可以通用。

总结

以上是生活随笔为你收集整理的剑指Offer(Java实现)把二叉树打印成多行的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。