目录
从上到下打印二叉树
描述
从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。
示例
给定二叉树: [3,9,20,null,null,15,7]
3 / \ 9 20 / \ 15 7
返回
[3,9,20,15,7]
提示
节点总数 <= 1000
数据结构
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
方法一:递归
我们创建一个list,里面存放各层的元素,list[0]存放的是第一层的元素,list[1]存放的是第二层的元素,...,list[i]存放的是第i层的元素。
我们遍历的时候添加当前节点的层数,然后将对应元素放入list的集合中,接着将该节点的左右子树调用方法添加到集合中。
class Solution {
ArrayList<ArrayList<Integer>> arr=new ArrayList<>();
public int[] levelOrder(TreeNode root) {
ArrayList<Integer> list=new ArrayList<>();
levelTravel(root,0);
int size=0;
for (int i = 0; i < arr.size(); i++) {
ArrayList<Integer> integers = arr.get(i);
for (int j = 0; j < integers.size(); j++) {
list.add(integers.get(j));
size++;
}
}
int[] res =new int[size];
for (int i = 0; i < size; i++) {
res[i]=list.get(i);
}
return res;
}
public void levelTravel(TreeNode root, int level){
if (root==null){
return;
}
if (arr.size()<=level){
arr.add(new ArrayList<Integer>());
}
ArrayList<Integer> curLevel = arr.get(level);
curLevel.add(root.val);
levelTravel(root.left,level+1);
levelTravel(root.right,level+1);
}
}
方法二:迭代
我们将根节点放在队列queue中,然后取队列第一个元素,将元素的左右儿子依次添加到队列中,并且将元素的值添加到list集合中,接着不断从队列中取元素添加儿子到队列中,直至队列为空。
class Solution {
public int[] levelOrder(TreeNode root) {
if (root==null){
return new int[0];
}
Queue<TreeNode> queue=new LinkedList<>();
ArrayList<Integer> list=new ArrayList<>();
queue.add(root);
while(!queue.isEmpty()){
TreeNode curNode=queue.poll();
list.add(curNode.val);
if (curNode.left!=null) queue.add(curNode.left);
if (curNode.right!=null) queue.add(curNode.right);
}
int[] res=new int[list.size()];
for (int i = 0; i < list.size(); i++) {
res[i]=list.get(i);
}
return res;
}
}