最近做题在做BFS系列,找到了有关二叉树层次遍历的几道题
二叉树的层次遍历使用的方法就是使用的BFS的思想,如下面一道题:
二叉树的层序遍历
题意:
给你一个二叉树,请你返回其按层序遍历得到的节点值。(即逐层地,从左到右访问所有节点)。
示例:
二叉树:[3,9,20,null,null,15,7]
层次遍历的结果:
[
[3],
[9,20],
[15,7]
]
分析
BFS就是利用队列逐层遍历的,只不过此时需要我们进行一个分层的操作,分层操作我采用的思想是:
用一个变量cnt记录每一层的数量,当该层元素从队列中弹出的时候,cnt–,当cnt变为0的时候,证明该层元素都已遍历完,我们在遍历的时候可以用一个临时的vector来存储,然后此时队列中存储的是下一层元素,将cnt更新为队列的尺寸,然后将临时vector存入ans中,清空该vector即可
代码
1 | /** |
二叉树的层次遍历II
题意:
相比于第一个做出的改变是“返回其节点值自底向上的层次遍历”
这个其实就是将遍历的每层结果插到最终结果的前面就可以了,解决倒序的问题
这个用vector.insert(vector.begin(),元素)
即可解决
不放代码了
二叉树的锯齿形层次遍历
题意:给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
如第一道例题里面的二叉树返回的结果为:
[
[3],
[20,9],
[15,7]
]
一种交替的效果
这个就需要根据正在遍历的层数的奇偶,而做出不同的操作,这里用到了c++中的双向队列deque<TreeNode *>dq
取前值:dq.front();
;去前值:dq.pop_front();
;插前值:dq.push_front(tempN->left);
;
取后值:dq.back();
;去后值:dq.pop_back();
;插后值:dq.push_back(tempN->right);
;
这题画图分析即可
重点关注奇偶层的插入是插在前面还是插在后面,取前面的值还是取后面的值
当然还有一种方法:层次遍历后,按偶数层倒置,不过这种麻烦一些
代码
1 | /** |