需求一:
逐层遍历二叉树并输出,每一层占一行。分析:
思路一:
1、逐层遍历二叉树也是BFS遍历二叉树,因此数据结构选择队列。2、需要用两个变量存储当前层待遍历的节点个数以及下一行的节点个数。
3、将头结点加入队列尾,当队列不是空的,就移除队列头部元素并输出,并将其儿子节点加入队列尾,当前层待遍历节点个数减一,更新下一层节点个数。
4、当当前层待遍历节点个数为0时,说明已经遍历了一行,这时就需要换行。
思路二:
思路一中定义了两个变量,存储当前行待遍历节点个数以及下一层节点个数,我们也可不用这两个变量。因为每次判断队列是否是空的时候,此时队列长度就是当前层的节点个数,记录该值,即为当前层的遍历次数,遍历结束即换行。需求二:
逐层遍历二叉树,将每一层的节点值存到集合中,最后返回包含每一层节点值的集合。分析:
思路一:
同需求一中的思路一,定义两个变量记录当前层和下一层节点个数。创建一个List集合,用于存储每一层的节点值,当该层遍历结束,将该层List集合添加到结果集合中,然后更新两个变量值,并且清空List集合思路二:
同需求一中的思路二,不用定义两个变量。每次判断是否为空的时候,创建List集合,用变量记录此时队列长度,即当前层应该遍历的节点个数,遍历结束意味着已经遍历了当前行,将该List集合添加到结果集合中即可代码:
import java.util.*;
class BinTree{
//表示二叉树的字符串数组
private String[] str;
//表示二叉树的List集合
private List<Node> list;
//构造函数
//传入字符串数组
BinTree(String[] str){
this.str = str;
}
//二叉树节点内部类
class Node{
int val;
Node left;
Node right;
Node(int val){
this.val = val;
this.left = null;
this.right = null;
}
}
//创建二叉树
public void createBinTree(){
list = new LinkedList<Node>();
//遍历字符串数组,将字符串转成相应的节点
for(String s : str)