题意: 给定一棵二叉树,返回节点value的层次遍历顺序(从左到右,按层显示)。
举例: 给定一颗二叉树{3,9,20,#,#,15,7}
3
/ \
9 20
/ \
15 7
返回层测顺序遍历
[
[3],
[9,20],
[15,7]
]
题目中给定的节点结构为
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
分析: 本题考察如何对二叉树做层次遍历,层次遍历和宽度优先遍历很像,也需要使用队列,只不过层次遍历需要使用两个队列。交替使用两个队列存放父亲节点和孩子节点,如一个队列Q1用来存父亲节点,节点出Q1时将左右孩子加到另一个队列Q2中,直到Q1为空;然后遍历Q2,Q1存放Q2中父亲节点的左右孩子。重复上述操作直到树遍历结束为止。
代码
public ArrayList<ArrayList<Integer>> levelOrder(TreeNode root) {
if(root == null){
return new ArrayList<>();
}else{
//层次遍历需要两个队列完成
Queue<TreeNode> level1 = new LinkedList<>(); //第一个队列
Queue<TreeNode> level2 = new LinkedList<>(); //第二个队列
ArrayList<ArrayList<Integer>> result = new ArrayList<>(); //返回结果
level1.add(root); //首先将第一个队列设置为根节点的值
while(!level1.isEmpty() || !level2.isEmpty()){
ArrayList<Integer> temp1 = new ArrayList<>(); //存放每一层的int值
while(!level1.isEmpty()){
TreeNode present = level1.poll(); //取出队列中的值
temp1.add(present.val);
if(present.left != null){
level2.add(present.left);
}
if(present.right != null){
level2.add(present.right);
}
}
if(temp1.size() > 0){
result.add(temp1);
}
ArrayList<Integer> temp2 = new ArrayList<>(); //存放每一层的int值
while(!level2.isEmpty()){
TreeNode present = level2.poll(); //取出队列中的值
temp2.add(present.val);
if(present.left != null){
level1.add(present.left);
}
if(present.right != null){
level1.add(present.right);
}
}
if(temp2.size() > 0){
result.add(temp2);
}
}
return result;
}
}