学习目标:
第六章 二叉树
- 层序遍历
学习内容:
层序遍历二叉树
(1)递归法思路:通过设定一个层级标签来确定每个元素应该是属于第几层来完成层次遍历
(2)迭代法思路:借用队列完成层次遍历的操作,先将根节点加入队列中,若队列长度不为零则弹出长度减一个队头元素,用一个数组进行数据的存储,并且判断其左右孩子是否为空,若不为空则将左右孩子加入到队列中,如此循环直到左右孩子全为空并且队列长度为0,此时表示该二叉树的层序遍历结束,最后用一个二维数组将前面得到的元素数组进行存储即可。其中,关键是根据数组长度的变换确定弹出的元素是属于原来二叉树中的哪一层,以此达到层序遍历的目的。
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
public class day_14 {
public List<List<Integer>> resList = new ArrayList<List<Integer>>();
public List<List<Integer>> levelOrder(TreeNode root) {
//checkFun01(root,0);
checkFun02(root);
return resList;
}
//DFS--递归方式
//思路:通过设定一个层级标签来确定每个元素应该是属于第几层来完成层次遍历
public void checkFun01(TreeNode node, Integer deep) {
if (node == null) return; // 如果节点为空,递归终止
deep++; // 增加层级
if (resList.size() < deep) {
// 当层级增加时,list的Item也增加,利用list的索引值进行层级界定
List<Integer> item = new ArrayList<Integer>(); // 创建一个新的列表,用于保存当前层级的节点值
resList.add(item); // 将新的列表添加到结果列表中
}
resList.get(deep - 1).add(node.val); // 将当前节点的值添加到对应层级的列表中
checkFun01(node.left, deep); // 递归遍历左子树
checkFun01(node.right, deep); // 递归遍历右子树
}
//BFS--迭代方式--借助队列
public void checkFun02(TreeNode node) {
if (node == null) return;
Queue<TreeNode> que = new LinkedList<TreeNode>();
que.offer(node);//队列中存入根节点
while (!que.isEmpty()) {
List<Integer> itemList = new ArrayList<Integer>();//存每层的数据元素
int len = que.size();//每层长度
while (len > 0) {//通过长度来判度队列中的哪些元素属于同一层
TreeNode tmpNode = que.poll();//弹出队列头部元素
itemList.add(tmpNode.val);//把值加入存放数据的数组中
//左右节点均存在则添加左右节点进入队列中
if (tmpNode.left != null) que.offer(tmpNode.left);
if (tmpNode.right != null) que.offer(tmpNode.right);
len--;
}
resList.add(itemList);//将获取到的元素全部存入结果数组中
}
}
}
学习时间:
下午三小时。