前言
“这是我参与8月更文挑战的第9天,活动详情查看:8月更文挑战”
介绍下二叉树层次遍历相关的问题
- NC15 求二叉树的层序遍历(中等)
- NC14 按之字形顺序打印二叉树(简单)
二叉树的层序遍历
描述:给定一个二叉树,返回该二叉树层序遍历的结果,(从左到右,一层一层地遍历) 例如: 给定的二叉树是{3,9,20,#,#,15,7}, 该二叉树层序遍历的结果是 [ [3], [9,20], [15,7] ]
思路分析: 使用队列,先把根节点加入到队列之中去, 当队列不为空时循环,
记录当前队列的节点数 size 即为当前层的节点数量, 当size 不为 0 时, 从队列中弹出节点,将val 加入到当前层的集合 temp 中, 然后 左子节点不为null 时将其加入队列, 右子节点做相同的操作
size 为 0 时 当前层遍历结束 将 temp 加入到最终的集合 ans 中
AC 代码:
public ArrayList<ArrayList<Integer>> levelOrder (TreeNode root) {
// write code here
if(root == null) return new ArrayList<>();
ArrayList<ArrayList<Integer>> ans = new ArrayList<>();
ArrayList<Integer> temp = new ArrayList<>();
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while(!queue.isEmpty()){
int size = queue.size();
temp.clear();
while(size-- != 0){
TreeNode node = queue.poll();
temp.add(node.val);
if(node.left !=null){
queue.offer(node.left);
}
if(node.right != null){
queue.offer(node.right);
}
}
ans.add(new ArrayList<>(temp));
}
return ans;
}
之字形顺序打印二叉树
描述: 给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替) 例如: 给定的二叉树是{1,2,3,#,#,4,5}
该二叉树之字形层序遍历的结果是 [ [1], [3,2], [4,5] ]
思路分析:
- 奇数行从队列的尾部插入, 从头弹出节点, 偶数行 从队列的头部插入, 从尾部弹出节点
- 按照层次遍历的方式写, 只不过在偶数行时 将 temp集合反转, 虽然也可以获取到正确的答案, 但注意它的遍历顺序不是之字形的, 所以不是很推荐这种解法,虽然可以AC
AC 代码:
public ArrayList<ArrayList<Integer> > Print(TreeNode root) {
if(root == null) return new ArrayList<>();
ArrayList<ArrayList<Integer>> ans = new ArrayList<>();
ArrayList<Integer> temp = new ArrayList<>();
LinkedList<TreeNode> queue = new LinkedList<>();
queue.offer(root);
boolean leftToRight =true;
while(!queue.isEmpty()){
int size = queue.size();
temp.clear();
while(size-- != 0){
TreeNode node ;
if(leftToRight){
node = queue.pollFirst();
if(node.left != null){
queue.addLast(node.left);
}
if(node.right != null){
queue.addLast(node.right);
}
}else{
node = queue.pollLast();
if(node.right != null){
queue.addFirst(node.right);
}
if(node.left != null){
queue.addFirst(node.left);
}
}
temp.add(node.val);
}
leftToRight = !leftToRight;
ans.add(new ArrayList<>(temp));
}
return ans;
}