2024.2.14
题目来源
我的题解
方法一 递归实现(前序遍历+记录深度)
在递归遍历时记录节点所在的深度,然后把值加入到对应的深度的链表中。并利用List的set方法更新对应层次的元素List
时间复杂度 :O(n)。遍历所有节点
空间复杂度:O(n)。递归空间的大小
java
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> res=new ArrayList<>();
if(root==null)
return res;
levelOrder1(root,0,res);
return res;
}
public void levelOrder1(TreeNode root,int level,List<List<Integer>> res){
if(root==null)
return ;
// 已经遍历过的层次
if(res.size()>level){
List<Integer> list=res.get(level);
list.add(root.val);
res.set(level,list);
// 还未遍历的层次
}else{
List<Integer> list=new ArrayList<>();
list.add(root.val);
res.add(list);
}
levelOrder1(root.left,level+1,res);
levelOrder1(root.right,level+1,res);
}
方法二 非递归实现(队列)
利用队列的先进先出的特性,将每一行的节点从左到右存入队列中,然后以此取出进行遍历,再加入相应的子节点。
时间复杂度:O(n)。需要遍历所有节点空间复杂度:O(n)。队列需要的空间
java
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> res=new ArrayList<>();
if(root==null)
return res;
Queue<TreeNode> queue=new LinkedList<>();
queue.offer(root);
while(!queue.isEmpty()){
int sz=queue.size();
List<Integer> temp=new ArrayList<>();
for(int i=0;i<sz;i++){
TreeNode t=queue.poll();
temp.add(t.val);
if(t.left!=null)
queue.offer(t.left);
if(t.right!=null)
queue.offer(t.right);
}
res.add(temp);
}
return res;
}
有任何问题,欢迎评论区交流,欢迎评论区提供其它解题思路(代码),也可以点个赞支持一下作者哈😄~