//双重循环,内循环遍历每一层的节点
public List<List> decorateRecord1(TreeNode root) {
Queue queue = new LinkedList<>();
List<List> result = new ArrayList<>();
if (root != null) queue.add(root);
while(!queue.isEmpty()) {
List<Integer> tmp = new ArrayList<>();
for (int i = queue.size(); i > 0; i--) {
TreeNode tmpNode = queue.poll();
tmp.add(tmpNode.val);
if (tmpNode.left!=null) queue.add(tmpNode.left);
if (tmpNode.right!=null) queue.add(tmpNode.right);
}
result.add(tmp);
}
return result;
}
class Solution {
public List<List<Integer>> decorateRecord(TreeNode root) {
List<List<Integer>> res = new ArrayList<>();
if (root == null)
return res;
Queue<TreeNode> q = new LinkedList<>();
q.add(root);
while (!q.isEmpty()) {
// 每次遍历之前记录队列的大小
int n = q.size();
List<Integer> sub = new ArrayList<>();
for (int i = 0; i < n; i++) {
TreeNode temp = q.poll();
// 取的同时,有左加左,有右加右
sub.add(temp.val);
if (temp.left != null)
q.add(temp.left);
if (temp.right != null)
q.add(temp.right);
}
res.add(sub);
}
return res;
}
}
class Solution {
public List<List<Integer>> decorateRecord(TreeNode root) {
Queue<TreeNode> tree = new LinkedList<>();
List<List<Integer>> ans = new ArrayList<>();
if (root != null)
tree.offer(root);
while (!tree.isEmpty()) {
int num = tree.size();
List<Integer> tmp = new ArrayList<>();
for (int i = 0; i < num; i++) {
if (tree.peek().left != null)
tree.offer(tree.peek().left);
if(tree.peek().right!=null)
tree.offer(tree.peek().right);
tmp.add(tree.poll().val);
}
ans.add(tmp);
}
return ans;
}
}
共以下 23 个回答
LCR 150. 彩灯装饰记录 II
时间O(N), 空间O(N)
class Solution {> decorateRecord(TreeNode* root) {> result; temp; cur=node.front();
public:
vector<vector
queue<TreeNode> node;
vector<vector
if(root!=nullptr){
node.push(root);
}
while(!node.empty()){
vector
int size=node.size();
for(int i=0;i<size;++i)
{
TreeNode
node.pop();
temp.push_back(cur->val);
};
中文
题解
跟上面那一题的思路是相同的,只是需要知道每一层有多少个,可以通过队列api,.size()去获取
方法:用队列,但是缓存当前层级的长度,以此来确定哪些值是在同一层的。
用两个while loop 大的while用来走完整个树 小的用来走完整个层级并把同一个层级的值放在同一个数组中。
time O(n) space O(n)
模板题
时间复杂度O(n),空间复杂度O(n)
在上面一题的基础上每一层输出在一起,就只用再来一个for循环,最大次数是队列长度
on on
思路:在上一题的基础上加上对每一层存入队列即可
时间复杂度和空间复杂度都是O(N)
时间o(n)
空间o(n)
跟上一题没啥区别
时间复杂度O(N),空间复杂度O(N)。
//双重循环,内循环遍历每一层的节点> decorateRecord1(TreeNode root) { queue = new LinkedList<>();> result = new ArrayList<>();
public List<List
Queue
List<List
if (root != null) queue.add(root);
打卡
class Solution {> decorateRecord(TreeNode root) { > res = new ArrayList(); deque = new ArrayDeque(); list = new ArrayList();
public List<List
List<List
if(root null) return res;
Deque
deque.offer(root);
while(!deque.isEmpty()){
int size = deque.size();
List
while(size– > 0){
TreeNode cur = deque.poll();
list.add(cur.val);
if(cur.left != null){
deque.offer(cur.left);
}
if(cur.right != null){
deque.offer(cur.right);
}
}
res.add(list);
}
return res;
}
}
层次遍历
时间:O(n)
空间:O(n)
要区分每一层,每次遍历之前记录队列的大小
队列+小循环
时间复杂度O(n)
空间复杂度O(n)
思路:使用队列实现
思路:使用队列实现层序遍历,对每一层的节点存储在集合中,每一层遍历完后存储到
res中。时间复杂度:O(n)
空间复杂度:O(n)