剑指 Offer 32 - I. 从上到下打印二叉树
题目描述
从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。
示例
给定二叉树: [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 返回: [3,9,20,15,7]
数据限制
节点总数 <= 1000
思路
递归以先序遍历的方式遍历一遍二叉树,在遍历的时候,加入一个变量表示深度,通样深度的节点顺序加入相应的列表,最后将列表归到一个列表,之后输出即可
时间复杂度:O(n)
空间复杂度:O(n)
代码
import java.util.*;
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
ArrayList<Integer> lis[] = new ArrayList[2005];
int top = 0;
public int[] levelOrder(TreeNode root) {
if (root == null) return new int[0];
for (int i = 0; i <= 2000; i++){
lis[i] = new ArrayList();
}
dfs(root, 1);
int num = 0;
for (int i = 1; i <= top; i++){
num += lis[i].size();
}
int[] ans = new int[num];
int l = 0;
for (int i = 1; i <= top; i++){
for (int j = 0; j < lis[i].size(); j++){
ans[l] = lis[i].get(j);
l++;
}
}
return ans;
}
void dfs(TreeNode p, int x){
top = Math.max(top, x);
lis[x].add(p.val);
if (p.left != null){
dfs(p.left, x + 1);
}
if (p.right != null){
dfs(p.right, x + 1);
}
}
}