题目描述:
给定一个二叉树,返回其按层次遍历的节点值,即按照层次,从上到下,从左到右遍历所有结点
例如:给定下列二叉树,打印结果[[1], [2, 3], [4, 5, 6, 7]]
思想:
使用广度优先搜素,即使用队列(先进先出)
- 先判断根节点是否为空,若是,直接返回
- 若非空,将根节点入队,然后判断队列是否为空,若不为空,访问队首结点(保存或打印),然后将队首结点出队,接着判断其左右子节点是否为空,若不为空,则入队即可
- 这里为了实现分层打印,使用cout(当前队列的值的个数,就是当前层的结点个数)作为计数器
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
class TreeNode{
int val;
TreeNode left;
TreeNode right;
TreeNode(int x){
val = x;
}
}
public class test1 {
static ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
public static void levelOrder(TreeNode root) {
if(root == null)
return;
//新建队列,LinkedList实现了Queued的接口
Queue<TreeNode> q = new LinkedList<TreeNode>();
q.offer(root);
//当队列不为空,循环
while(!q.isEmpty()) {
//count的作用是计数,然后按层输出
int count = q.size();
ArrayList<Integer> list = new ArrayList<Integer>();
while(count > 0) {
//取出栈顶结点
TreeNode temp = q.peek();
//弹出栈顶结点
q.poll();
//栈顶结点加入list
list.add(temp.val);
//如果当前结点存在左右子树,继续存放的队列中,先左后右
if(temp.left != null)
q.offer(temp.left);
if(temp.right != null)
q.offer(temp.right);
//更新count
count--;
}
res.add(list);
}
}
public static void main(String[] args) {
TreeNode root = new TreeNode(1);
root.left = new TreeNode(2);
root.right = new TreeNode(3);
root.left.left = new TreeNode(4);
root.left.right = new TreeNode(5);
root.right.left = new TreeNode(6);
root.right.right = new TreeNode(7);
levelOrder(root);
System.out.println(res);
}
}
打印结果: