leetcode
二叉树的层序遍历
给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)
实例:
二叉树:[3,9,20,null,null,15,7]
3
/ \
9 20
/ \
15 7
返回其层次遍历结果:
[
[3],
[9,20],
[15,7]
]
解法1:队列法
解题思路:二叉树的层次遍历就是用一个队列来实现的,将每一个结点放入队列中,取出每一个结点后将其左右孩子放入队列中,这道题唯一的难点就是我们要区分出每一个结点是树第几层的结点,所以我们可以用一个Pair类来存放队列中的每一个结点,Pair类的定义如下:
class Pair{
TreeNode node;
int level;
}
level表示该结点是第几层的,每当我们将一个结点入队,就将其level置为其父节点的level+1,然后进行队不空循环,用一个lastLevel值来存放队列上一个结点的level值,以此来进行层次的区分,当lastLevel!=level时,就新建一个List来存放下一层的结点的值,然后将当前List加入到结果集中,因为现在对Java中各种类的使用还不熟悉,我就不自己实现了,实际上用C来写的话还要方便一点
解法2:for循环遍历法
解题思路:该解法的思想就是,首先在数组中加入根结点,然后每次都将队列中的所有元素取出,加入到List中,然后将他们的孩子结点都加入到数组中,下一次再进行for循环将所有孩子结点都取出来,实际上跟层次法是很像的,不过这一个方法更简洁
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
//按层遍历即可
//1.
List<List<Integer>> lists = new ArrayList<>();
if (root == null)
{
return lists;
}
//2.
List<TreeNode> nodes = new ArrayList<>();
nodes.add(root);
while (!nodes.isEmpty()) {
int size = nodes.size();
List<Integer> list = new ArrayList<>();
for (int i = 0; i < size; i++) //将每一层的所有结点取出
{
TreeNode remove = nodes.remove(0);//这里利用了remove的特点,将一个结点移除,所以每一次都取第一个元素就可以了
list.add(remove.val);
if (remove.left != null) {
nodes.add(remove.left);
}
if (remove.right != null) {
nodes.add(remove.right);
}
}
lists.add(list);
}
return lists;
}
}
题目以及解法来源于
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-level-order-traversal
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。