数据结构与算法分析笔记与总结(java实现)--二叉树14:把二叉树打印成多行
来源:互联网 发布:网络大电影男演员 编辑:程序博客网 时间:2024/05/21 00:47
题目:从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。
思路:按层打印,使用按层遍历(宽度优先遍历)即可,需要使用一个队列(通过LinkedList来充当队列),然后进行循环即可,如果不需要考虑换行,那么十分简单。如果需要考虑换行,那么关键就是确定何时进行换行,如何确定换行?使用2个指针last和nlast来分别指向下一行的最后一个结点合当前正在访问(不是遍历,是指压入队列的元素)的最后一个结点。初始时,认为初始指针在头结点的上方空间,此时令last=root;nlast=null,然后进行按层遍历,每次从队列中弹出一个结点temp表示当前遍历到的结点,要与下一行的最后一个结点last进行比较,看是否相同,如果相同就换行,否则继续;每次从队列中弹出一个结点后需要将其2个子节点进行判断并压入队列中,将nlast指向当前压入队列的结点,如果temp==last,表示正在遍历的结点已经到达行的结尾,此时必然恰好该temp的第二个子节点就是下一行的最后一个结点,于是将nlast赋值给last对last进行更新即可。每一行遍历结束后就新建一个ArrayList即可。
常识:创建集合时不要使用接口List,如果使用List,那么list就是List类型的,于是不能使用poll等方法,即变量总是使用它的静态类型作为其真正的类型(jvm)。
importjava.util.*;
//按层遍历,使用last,nlast指针来进行换行
publicclass Solution {
//使用成员变量来存放结果集合,也可以作为参数传入到方法中
ArrayList<ArrayList<Integer>>results;
ArrayList<ArrayList<Integer>>Print(TreeNode pRoot){
//创建一个ArrayList<ArrayList<Integer>>用于存放答案
results=newArrayList<ArrayList<Integer>>();
//调用一个单独的方法解决问题,仔细:这里传入的参数是pRoot而不是root
//特殊输入:要注意空节点输入的情况:此时返回的是一个空的list而不是null
if(pRoot==null) return results;
this.process(pRoot);
//返回结果
return results;
}
//输入一棵二叉树,按层遍历,将每一层的结点放入一个ArrayList中
private void process(TreeNode root){
//①创建一个队列
LinkedList<TreeNode> queue=newLinkedList<>();
ArrayList<Integer> list=newArrayList<>();
//②创建辅助的变量指针last和nlast
TreeNode last=root;
TreeNode nlast=null;
//③先将根结点root放入到队列中
queue.add(root);
//开始循环:弹出--遍历--压入左右子孩子--判断是否到层的结尾
while(queue.size()!=0){
//弹出遍历一个结点
TreeNode temp=queue.poll();
//int放入Integer中,会自动装箱
list.add(temp.val);
//先压入左右子孩子并更新nlast
if(temp.left!=null){
queue.add(temp.left);
nlast=temp.left;
}
if(temp.right!=null){
queue.add(temp.right);
nlast=temp.right;
}
//判断当前遍历的结点是否到达层的最后结尾
if(last==temp){
//到达层的最后一个结点,更新last
last=nlast;
//此时换一个新的list来存放每层的结点,并将当前层的list放入到结果集中
results.add(list);
list=newArrayList<Integer>();
}
}
}
}- 数据结构与算法分析笔记与总结(java实现)--二叉树14:把二叉树打印成多行
- 数据结构与算法分析笔记与总结(java实现)--二叉树1:递归二叉树的序列打印练习题
- 数据结构与算法分析笔记与总结(java实现)--二叉树2:非递归二叉树的序列打印练习题
- 数据结构与算法分析笔记与总结(java实现)--二叉树16:从上往下打印二叉树
- 数据结构与算法分析笔记与总结(java实现)--二叉树17:按之字形顺序打印二叉树
- 数据结构与算法分析笔记与总结(java实现)--二叉树3:二叉树按层遍历打印练习
- 数据结构与算法分析笔记与总结(java实现)--二叉树11:二叉树的深度
- 数据结构与算法分析笔记与总结(java实现)--二叉树13:平衡二叉树
- 数据结构与算法分析笔记与总结(java实现)--二叉树15:对称的二叉树
- 数据结构与算法分析笔记与总结(java实现)--二叉树24:重建二叉树
- 数据结构与算法分析笔记与总结(java实现)--二叉树25:序列化二叉树
- 数据结构与算法分析笔记与总结(java实现)--二叉树笔记
- 数据结构与算法分析笔记与总结(java实现)--二叉树22:二叉搜索树与双向链表
- 数据结构与算法分析笔记与总结(java实现)--二叉树23:树的子结构
- 数据结构与算法分析笔记与总结(java实现)--二叉树7:折纸练习题
- 数据结构与算法分析笔记与总结(java实现)--二叉树8:寻找错误结点练习题
- 数据结构与算法分析笔记与总结(java实现)--二叉树9:树上最远距离练习题
- 数据结构与算法分析笔记与总结(java实现)--二叉树5:平衡二叉树判断练习题
- Linux简介
- ubuntu安装并启动redis
- 【Codeforces 756 D. Artsem and Saunders】+ 思维 + 构造
- AngularJs服务-$log
- 找不到scalameter 利用intellij scala 导入jar 添加resource
- 数据结构与算法分析笔记与总结(java实现)--二叉树14:把二叉树打印成多行
- 关于WindowManager.LayoutParams.TYPE_SYSTEM_ALERT适配的问题
- 深入分析python yield
- 用ajax实现文件下载
- getifaddrs导致Segmentation fault
- 数据结构与算法分析笔记与总结(java实现)--二叉树15:对称的二叉树
- jforum用到MySQL设置字符集为UTF8(Windows版)解决中文乱码
- 实现一键下载安装
- POJ1009_Edge Detection_跳跃式编码