2024.2.14
- 题目来源
- 我的题解
- 方法一 递归实现(前序遍历+记录深度)
- 方法二 非递归实现(队列)
题目来源
力扣每日一题;题序:102
我的题解
方法一 递归实现(前序遍历+记录深度)
在递归遍历时记录节点所在的深度,然后把值加入到对应的深度的链表中。并利用List的set方法更新对应层次的元素List
时间复杂度:O(n)。遍历所有节点
空间复杂度:O(n)。递归空间的大小
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)。队列需要的空间
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;
}
有任何问题,欢迎评论区交流,欢迎评论区提供其它解题思路(代码),也可以点个赞支持一下作者哈😄~