二叉树的层次遍历(按层封装)
最近在数据结构的道路上前进,上周完成了二叉树模块的基本练习,今天和大家分享一下二叉树的层次遍历(按层封装)的思路和想法
并且以后会持续更新数据结构模块的内容,好了言归正传:
二叉树的遍历分为四种前,中,后和层次遍历以上遍历逐个讲解
今天我们讲解 二叉树的层次遍历(按层封装)
比如就这样一颗二叉树:
很容易理解层测遍历的结果为
3 9 20 15 17
作为一个树结构我们不能像线性结构那样进行简单的循环而是通过一些技巧来实现一些操作这里我们根据层次遍历的特点使用
队列进行操作为什么呢?
1.我们先让3进队当我们的队列不为空时进行迭代
2.第一个出队的肯定是3然后我们观察它的左右子树是否为空很明显3的左右子树都不为空然后我们让它们进队
3.这时候我们需要一个东西来保存出队元素这里我们使用list就可以
4.我们来走一下过程
3 in(queue)
3 out(queue) in(list)
3.left=9 3.right=20 in(queue)
9 out(queue)(下方无节点不管) in(list)
20 out(queue) in(list)
20.left=15 20.right=7 in(queue)
15 out(queue)(下方无节点不管) in(list)
7 out(queue)(下方无节点不管) in(list)
这样二叉树就按层次打印完毕看起来很简单接下来我们要对他们进行按层封装
怎么办呢?
首先我们想想进队时我们会一次进队一个或两个或0个元素那么我们是不是可以做个计数器统计一下
然后每次出队一个元素我们也是不是可以统计一下
假如出队计数器叫 level
入队计数器叫 levelnum
我们来模拟下看看会有什么发现
1.首先我们会先让3进队 此时 level=1;
2.然后3出队 level-1
3.再然后3的左孩子进队3的有孩子进队levelnum+=2
4.此时level=0 levelnum=2
5.然后是不是该第二层的第一个元素出队了?
6.我们再让level=levelnum levelnum=0
7.是不是第二层就开始了接下来的几层都是一样的
**所以我们得出结论:
level>0时
我们让元素出队level- -
让不为null的左右孩子进队
每进一一个元素 levelnum++
当level=0时
我们让level=levelnum levelnum=0
重新来个list保存下一层元素
最后当队列为空时 我们的list里封装了每层的list 就可以得到我们想要的结果
**
然后上代码
public List<List<TreeNode>> levelOrder(TreeNode root) {
List<List<TreeNode>> list=new ArrayList<>();//用来保存每层的list
Queue<TreeNode> queue=new LinkedList<>();//队列用来保存根节点
List<TreeNode> newList=new ArrayList<>();//用来保存第一层的list
queue.add(root);//第一个元素入队
int level=1;//此时为第一层 出队计数器
int levelNum=0;//入队计数器
while(!queue.isEmpty()){
if(level==0){
list.add(newList);
newList=new ArrayList<>();//每层保存完毕重新实例化一个list用来保存接下来一层的节点
level=levelNum;
levelNum=0;
}
TreeNode node=queue.poll();
if(node!=null){//只有当根不为空才可以有左右孩子这里会把null保存进去当左右孩子不存在的时候
queue.add(node.left);
queue.add(node.right);
levelNum+=2;
}
newList.add(node);
level--;
}
return list;
}