问题描述:传入根节点,从上往下打印出二叉树的每个节点,同层节点从左至右打印。
解决思路:使用一个队列存放节点。先将根节点加入到队列中,然后循环遍历队列中的元素,遍历过程中,访问该节点的左右子节点,再将左右子节点加入到队列中。
public class Solution {
public ArrayList<TreeNode> PrintFromTopToBottom(TreeNode root) {
//创建一个列表用来存储节点
ArrayList<TreeNode> treeList=new ArrayList<TreeNode>();
if(root==null){//没有节点
return null;
}
//1、先存入根节点
treeList.add(root);
//2、循环遍历列表,一开始列表中只有根节点,因此size==1
for(int i=0;i<treeList.size();i++){
TreeNode node= treeList.get(i);
//3、如果左子节点不为空,则将左子节点加入到列表中,这时列表的size加1
if(node.left!=null){
treeList.add(node.left);
}
//3、如果右子节点不为空,则将右子节点加入到列表中,这时列表的size加1
if(node.right!=null){
treeList.add(node.right);
}
//4、因为执行上面操作后会增加列表的size,因此可以继续循环下一个节点,直到循环完所有节点
}
return treeList;
}
}
如图所示二叉树:
1、首先将根节点加入到list中,因此此时list中数据为:
1 |
2、循环遍历列表:list.size = 1,i=0时获取到节点1,因为节点1有左子节点2,因此将左子节点2加入到list中,此时list.size = 2
1 | 2 |
3、因为节点1有右子节点3,因此将右子节点3加入到list中,此时list.size=3
1 | 2 | 3 |
4、因为list.size=3,因此可以进行下一次循环,i=1,获取到节点2,因为节点2有左子节点4,因此将左子节点4加入到list中,此时list.size=4
1 | 2 | 3 | 4 |
5、因为节点2有子右节点5,因此将右子节点5加入到list中,此时list.size=5
1 | 2 | 3 | 4 | 5 |
6、继续循环遍历list,i=2,获取到节点3,因为节点3没有子节点,因此继续循环遍历list,因为节点4、5均没有子节点,因此遍历完成。