二叉树的层序遍历
本文更新一种二叉树的遍历方式(层序遍历),来自LeetCode102题,题目来源:LeetCode102题传送门
其他二叉树遍历方法传送门如下:
题目详情如下:
Java代码如下:
package LeetCode102;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
public class Solution {
public static void main(String[] args) {
TreeNode node1=new TreeNode(3);
TreeNode node2=new TreeNode(9);
TreeNode node3=new TreeNode(20);
TreeNode node4=new TreeNode(15);
TreeNode node5=new TreeNode(7);
node1.left=node2;
node1.right=node3;
node3.left=node4;
node3.right=node5;
List<List<Integer>> res = new ArrayList<>();
res=levelOrder(node1);
System.out.println(res);
}
public static List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> res = new ArrayList<>();
// 层次数组
List<Integer> level = new ArrayList<>();
// 辅助遍历的队列
LinkedList<TreeNode> helper = new LinkedList<>();
// 分节符,用于区分层次结构
TreeNode dummyNode = new TreeNode(Integer.MIN_VALUE);
helper.addLast(root);
// 如果为空则直接返回
if (root == null){
return res;
}
// 根节点直接推入分界符
helper.addLast(dummyNode);
// 当辅助队列不为空
while (helper.size()>0){
// 从队列中取出头节点
TreeNode node = helper.getFirst();
helper.removeFirst();
// 如果当前节点是分界符
if (node == dummyNode){
// 说明这一层遍历完毕,将数组加入结果
res.add(level);
// 创建新数组
level = new ArrayList<>();
// 此时下一层所有节点应该都进入了队列
// 当队列非空插入分界符
if (!helper.isEmpty()){
helper.addLast(dummyNode);
}
}else {
// 未到分界符就不断加入数
level.add(node.val);
// 节点左右不为空则入队
if (node.left!=null){
helper.addLast(node.left);
}
if (node.right!=null){
helper.addLast(node.right);
}
}
}
return res;
}
}