二叉树层次遍历简介
广度优先又叫层次遍历,基本过程如下:
层次遍历就是从根结点开始,把这一层的元素访问完才会访问下一层的元素,如上图访问的结果为[3,9,20,8,13,15,17];
接下来我们做一道简单的层次遍历题,直接输出全部元素。
上面的二叉树应输出的结果为[3,9,20,15,7]。
思路:先将根结点放入队列中,访问队列中的元素,将队头结点出队,输出出队结点的元素,再将出队结点的左右孩子结点入队,重复访问直到队空,具体代码如下:
//二叉树结点
class TreeNode{
int val;
TreeNode left;
TreeNode right;
public TreeNode(int val){
this.val = val;
}
}
public class Test {
//输入二叉树的根结点,遍历得到整个二叉树的数值,并返回
public static List<Integer> simpleLevelOrder(TreeNode root) {
if(root == null) {
return new ArrayList<Integer>();
}
//定义一个列表res保存遍历到的二叉树的数据
List<Integer> res = new ArrayList<>();
//定义一个队列用于遍历二叉树
LinkedList<TreeNode> queue = new LinkedList<>();
queue.add(root);
while(queue.size()>0) {
TreeNode t = queue.remove();
res.add(t.val);
if(t.left != null) {
queue.add(t.left);
}
if(t.right != null) {
queue.add(t.right);
}
}
return res;
}
public static void main(String[] args) {
//测试
TreeNode t0 = new TreeNode(3);
TreeNode t1 = new TreeNode(9);
TreeNode t2 = new TreeNode(20);
TreeNode t3 = new TreeNode(15);
TreeNode t4 = new TreeNode(7);
t0.left = t1;
t0.right = t2;
t2.left = t3;
t2.right = t4;
List<Integer> res = simpleLevelOrder(t0);
System.out.println(res);
}
}
查找树的每一层最大数
给定一颗树的根结点n0,查找这个树的每一层的最大数
根据题意编写出方法largetNumber(TreeNode root)如下:
//二叉树结点
class TreeNode{
int val;
TreeNode left;
TreeNode right;
public TreeNode(int val) {
this.val = val;
}
}
public class Test {
public static void main(String[] args) {
//简单测试
TreeNode n0 = new TreeNode(1);
TreeNode n1 = new TreeNode(3);
TreeNode n2 = new TreeNode(2);
n0.left = n1;
n0.right = n2;
TreeNode n3 = new TreeNode(5);
TreeNode n4 = new TreeNode(3);
n1.left = n3;
n1.right = n4;
TreeNode n5 = new TreeNode(9);
n2.right = n5;
System.out.println(largetNumber(n0));
}
//求二叉树每一层的最大值
public static List<Integer> largetNumber(TreeNode root){
//创建列表res用于保存每一层的最大数
List<Integer> res = new ArrayList<>();
Deque<TreeNode> tree = new ArrayDeque<>();
if(root != null) {
tree.addLast(root);
}
while(!tree.isEmpty()) {
int max = Integer.MIN_VALUE;
int size = tree.size();
//开始遍历这一层的所有元素,比较大小
for(int i = 0;i<size;i++) {
TreeNode node = tree.poll();
max = Math.max(max, node.val);
if(node.left != null) tree.addLast(node.left);
if(node.right != null) tree.addLast(node.right);
}
res.add(max);
}
return res;
}
}