LeetCode102.二叉树的层序遍历(Java实现)
二叉树简介
百度百科:
- 二叉树(Binary tree)是树形结构的一个重要类型。许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。二叉树特点是每个结点最多只能有两棵子树,且有左右之分 。
- 二叉树是n个有限元素的集合,该集合或者为空、或者由一个称为根(root)的元素及两个不相交的、被分别称为左子树和右子树的二叉树组成,是有序树。当集合为空时,称该二叉树为空二叉树。在二叉树中,一个元素也称作一个结点 [1] 。
如上图:层序遍历就应该是 F C E A D H G B M
思考:如何实现
思路分析
-
首先我们确定这个树不为空,如果为空返回空数据,如果不为空再操作。
-
在层序遍历的时候我们发现,如果根节点是被遍历对象,先遍历根节点,再遍历左孩子,然乎右孩子。
-
确保左孙子节点在右孩子节点之后,如果孙子或者孩子节点为空不需要遍历。
-
如果后代没有可以遍历的节点,则返回数据,遍历结束。
编码实现(java)
package com.yang.leetcode.classic;
import java.util.ArrayList;
import java.util.List;
/**
* @author: fudy
* @date: 2020/9/14 下午 03:56
* @Decription: leetCode102:层序遍历
**/
@SuppressWarnings("unused")
public class LevelTraversal {
// 数据结构
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> lists = new ArrayList<>();
// 判空处理
if (root == null) {
return lists;
}
// 这里存放树的节点
List<TreeNode> nodes = new ArrayList<>();
// 先把root节点加入节点集合
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);
// 把节点(类似于根节点)信息加入信息集合
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;
}
}
如有其他解法,欢迎评论!