Acwing43.不分行从上往下打印二叉树
题目描述:
从上往下打印出二叉树的每个结点,同一层的结点按照从左到右的顺序打印。
示例:
输入如下图所示二叉树[8, 12, 2, null, null, 6, null, 4, null, null, null]
8
/ \
12 2
/
6
/
4
输出:[8, 12, 2, 6, 4]
算法思路:
本题其实使用BFS就可以轻松的解决,定义一个队列,然后先将该二叉树的根结点入队,然后依次队列当中的结点出队,判断是否有左右子结点,如果有左右子结点则将其继续加入到队列当中,直到队列为空为止。
其实这道题相对于分行简单很多,其简单之处就是不需要记录当前行结点的个数,那么如何记录当前行结点的个数,则将会在下面解释。
算法实现:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<Integer> printFromTopToBottom(TreeNode root) {
//定义一个队列用来存储二叉树的结点元素
Queue<TreeNode> queue = new LinkedList<>();
//定义一个列表来存储结果
List<Integer> list = new ArrayList<>();
if(root==null){
return list;
}
queue.add(root);
while(!queue.isEmpty()){
//当队列不为空
//将队首元素出队
TreeNode node = queue.poll();
//将出队元素加入到列表当中
list.add(node.val);
//左子树是否为空
if(node.left!=null){
queue.add(node.left);
}
//右子树是否为空
if(node.right!=null){
queue.add(node.right);
}
}
//将结果返回
return list;
}
}
Acwing44.分行从上往下打印二叉树
题目描述:
从上到下按层打印二叉树,同一层的结点按从左到右的顺序打印,每一层打印到一行。
示例:
输入如下图所示二叉树[8, 12, 2, null, null, 6, null, 4, null, null, null]
8
/ \
12 2
/
6
/
4
输出:[[8], [12, 2], [6], [4]]
算法思路:
本题,相对于上一题的难处就在于如何记录二叉树每一行的结点个数,其实每一行结点个数就是在上一层遍历完之后,当前队列当中所含的元素个数即为当前行结点个数,那么我们在一行遍历完以后使用变量Len来记录当前行结点个数;(因为如果不记录,那么当结点出队时就会有其左右子结点继续加入,那么就无法计算了);然后使用while循环对Len进行遍历,每次出队一个结点,将其左右子结点加入到队列当中,然后Len–;直到当前Len=0即该行遍历结束位置,继续一行结点的遍历。
算法实现:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<List<Integer>> printFromTopToBottom(TreeNode root) {
//定义一个队列用来存储二叉树的结点元素
Queue<TreeNode> queue = new LinkedList<>();
//定义一个列表来存储结果
List<List<Integer>> list = new ArrayList<>();
if(root==null){
//特殊情况
return list;
}
queue.add(root);
while(!queue.isEmpty()){
//每一次循环之前队列当中的元素其实就是该层结点的元素
List<Integer> list2 = new ArrayList<>();
//定义一个变量用来表示每一层元素的个数
int num = queue.size();
while(num>0){
//对每一层的元素进行遍历
//将当前队列的元素出队
TreeNode node = queue.poll();
list2.add(node.val);
//将当前层所有结点的左右子结点遍历后入队
if(node.left!=null){
queue.add(node.left);
}
if(node.right!=null){
queue.add(node.right);
}
//当前行可能会有多个元素,没遍历完一个就-1
num--;
}
//将该行遍历完的元素加入到大队列当中
list.add(list2);
}
//将结果返回
return list;
}
}