二叉树14:把二叉树打印成多行
来源:互联网 发布:淘宝怎么贷款最高额度 编辑:程序博客网 时间:2024/06/11 11:03
题目:从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。
思路:按层打印,使用按层遍历(宽度优先遍历)即可,需要使用一个队列(通过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)。
import java.util.*;//按层遍历,使用last,nlast指针来进行换行public class Solution { //使用成员变量来存放结果集合,也可以作为参数传入到方法中 ArrayList<ArrayList<Integer>> results; ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) { //创建一个ArrayList<ArrayList<Integer> >用于存放答案 results=new ArrayList<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=new LinkedList<>(); ArrayList<Integer> list=new ArrayList<>(); //②创建辅助的变量指针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=new ArrayList<Integer>(); } } }}
0 0
- 把二叉树打印成多行
- 把二叉树打印成多行
- 把二叉树打印成多行
- 把二叉树打印成多行
- 把二叉树打印成多行
- 把二叉树打印成多行
- 把二叉树打印成多行
- 把二叉树打印成多行
- 把二叉树打印成多行
- 把二叉树打印成多行
- 把二叉树打印成多行
- 把二叉树打印成多行
- 把二叉树打印成多行
- 把二叉树打印成多行
- 把二叉树打印成多行
- 把二叉树打印成多行
- 把二叉树打印成多行
- 把二叉树打印成多行
- 阿里用技术帮用户剁手——《尽在双11——阿里巴巴技术演进与超越》
- SDUT 3258 Square Number【思维+高效预处理】
- 短信验证-互亿短信
- oracle存储过程基本使用
- 【SQL之查询】MySQL查询今天、昨天、上周、近30天、去年等的数据的方法
- 二叉树14:把二叉树打印成多行
- HDU5334(构造,思维)
- spring整合redis(集群、主从)
- Linux下安装MySQLdb模块(Python)
- C#实现环信用户和群组操作
- 二叉树15:对称的二叉树
- 递归和栈求解迷宫的最短路径
- 数据回显
- NS3编译遇到的Python相关的问题解决办法