class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> ans = new LinkedList<>();
if (root == null) return ans;
Queue<TreeNode> q = new LinkedList<>();
q.add(root);
boolean flag = false;
while (!q.isEmpty()) {
Queue<TreeNode> t = new LinkedList<>();
List<Integer> res = new LinkedList<>();
while (!q.isEmpty()) {
TreeNode node = q.poll();
res.add(node.val);
if (node.left != null) t.add(node.left);
if (node.right != null) t.add(node.right);
}
q = t;
if (flag) Collections.reverse(res);
flag = !flag;
ans.add(res);
}
return ans;
}
}
def levelOrder(root: TreeNode):
if root == None:
return []
res = []
# 利用队列
queue = [root]
# 判断是否需要反转列表
deep = 1
while not len(queue)==0:
cur_list = []
length = len(queue)
for _ in range(length):
cur_list.append(queue[_].val)
if queue[_].left:
queue.append(queue[_].left)
if queue[_].right:
queue.append(queue[_].right)
queue = queue[length:]
if deep % 2 == 0:
cur_list = cur_list[::-1]
res.append(cur_list)
return res
class Solution:
def levelOrder(self, root: TreeNode) -> List[List[int]]:
if not root: return []
queue=collections.deque()
tmp=collections.deque()
level,res=[],[]
queue.append(root)
j=0
while queue:
node=queue.popleft()
tmp.append(node)
level.append(node.val)
if not queue:
j=j+1
for i in range(len(tmp)):
node=tmp.popleft()
if node.left:queue.append(node.left)
if node.right:queue.append(node.right)
if j%2==0:
level=level[::-1]
res.append(level)
level=[]
return res
class Solution:
def levelOrder(self, root: TreeNode) -> List[List[int]]:
if not root:
return []
stack = [root]
tmp = []
res = []
q = len(stack)
i = True
while stack:
v = stack.pop(0)
if i:
tmp.append(v.val)
else:
tmp.insert(0, v.val)
if v.left:
stack.append(v.left)
if v.right:
stack.append(v.right)
if len(tmp) == q:
res.append(tmp)
tmp = []
q = len(stack)
i = i != True
return res
包含中文
public List<List<Integer>> level(TreeNode root){
if (root==null) return new ArrayList<>();
Queue<TreeNode> queue=new LinkedList<>();
List<List<Integer>> res=new ArrayList<>();
int sum=1;
queue.add(root);
while (!queue.isEmpty()){
int k=queue.size();
LinkedList<Integer> tmp=new LinkedList<>();
for (int i = 0; i < k; i++) {
TreeNode t=queue.poll();
if (sum%2==1){
tmp.add(t.val);
}else {
tmp.addFirst(t.val);
}
if (t.left!=null)queue.add(t.left);
if (t.right!=null) queue.add(t.right);
}
res.add(tmp);
sum++;
}
return res;
}
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
Queue<TreeNode> que = new LinkedList<>();
List<List<Integer>> res = new ArrayList<>();
if(root == null) return res;
que.add(root);
int k =1;
while(!que.isEmpty()){
int len = que.size();
LinkedList<Integer> list = new LinkedList<>();
for(int i = 0;i<len;i++){
TreeNode pre = que.poll();
if(k%2 == 1){
list.add(pre.val);
}else{
list.addFirst(pre.val);
}
if(pre.left!=null) que.add(pre.left);
if(pre.right!=null) que.add(pre.right);
}
res.add(list);
k++;
}
return res;
}
}
class Solution:
def levelOrder(self, root: TreeNode) -> List[List[int]]:
if not root: return []
num = [root]
res = []
while num:
k,tem= [],collections.deque()
for i in num:
if len(res)%2:tem.appendleft(i.val)
else: tem.append(i.val)
if i.left: k.append(i.left)
if i.right: k.append(i.right)
num = k
if tem :res.append(list(tem))
return res
class Solution:
def levelOrder(self, root: TreeNode) -> List[List[int]]:
if not root:
return []
res = []
queue = [root]
while queue:
sub_res = []
for i in range(len(queue)):
cur_node = queue.pop(0)
# 奇数层(root为第0层)
if len(res) % 2:
sub_res.insert(0,cur_node.val)
# 偶数层
else:
sub_res.append(cur_node.val)
if cur_node.left:
queue.append(cur_node.left)
if cur_node.right:
queue.append(cur_node.right)
res.append(sub_res)
return res
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
if (root == null) {
return new ArrayList<>();
}
Queue<TreeNode> queue = new LinkedList<>();
List<List<Integer>> res = new ArrayList<>();
int sum = 1;
queue.add(root);
while (!queue.isEmpty()) {
int k = queue.size();
LinkedList<Integer> tmp = new LinkedList<>();
for (int i = 0; i < k; i++) {
TreeNode t = queue.poll();
if (sum % 2 == 1) {
tmp.add(t.val);
} else {
tmp.addFirst(t.val);
}
if (t.left != null) {
queue.add(t.left);
}
if (t.right != null) {
queue.add(t.right);
}
}
res.add(tmp);
sum++;
}
return res;
}
}
共以下 44 个回答
复习集合方面的知识
使用flag标记是否反转即可
O(n) O(n)
这道题在上一道题基础上加一个判断条件就行,没什么好说的
时间复杂度 O(n)
空间复杂度 O(n)
时间复杂度 O(n)
空间复杂度 O(n)
**时间复杂度 O(N) **
**空间复杂度 O(N) **
用flag来转变每层元素的插入顺序
每一次注意反转的先后顺序,捋清楚堆是不能反转,反转的只能是vec
还是基于上一问的修改,res 中的vector个数代表了已经存放的层数,从第二层开始,奇数层倒序存放val,偶数层正序。
时间复杂度O(n) 空间复杂度O(n+m+k)
n是二叉树的空间 m是收集数组 k是每层数组
时间复杂度 O(n)
时间O(n),空间O(n)
思路:和之前分层打印二叉树的思路一样,只不过需要把偶树层(从第一层起,没有第0层)的结果翻转,可以中res中进行翻转,也可以先翻转后,再加入res中。我是用一个双端队列先翻转后加入到res中,只不过deque存放是节点,leetcode官方题解deque存的是节点值,所以代码简洁,我的代码有些冗余。时间和空间复杂度都为O(N)。
通过双端队列缓存每一行,根据奇偶行分别进行后插和前插操作。最后转换为vector类型放到结果中
时间O(n),空间O(n)
时间空间复杂度O(n)
有俩种比较简单的方法,这个直接将偶数层的Tmp反转。
层序遍历
解题思路:
利用双端队列的两端皆可添加元素的特性,设打印列表(双端队列) tmp ,并规定:
奇数层 则添加至 tmp 尾部 ,
偶数层 则添加至 tmp 头部 。
//队列、、> res;{});
class Solution {
public:
vector<vector
void fun(TreeNode* root,int num){
if(!root) return;
if(numres.size()) res.push_back(vector
res[num].push_back(root->val);
fun(root->left,num+1);
fun(root->right,num+1);
return;
}
};
和前一个题差不多,多了一个奇偶判断,
时间O(n)
空间O(n)
注意:双端队列deque中的push_back为正序,push_front为逆序,为了保证函数返回的类型为vector<vector>,还需要额外进行一次vector (val.begin(), valend())处理
时间空间复杂度为O(n)
时间:O(n) 空间O(n)
双向链表不会,还得继续学习,关键在于奇偶的,时间复杂度为O(n),空间复杂度为O(n)
解题思路:增加一个对当前层是奇数层还是偶数层的判断,从而决定是正序还是倒序
时间复杂度:O(n)
空间复杂度:O(n)
时间:O(n),空间:O(n)
使用Collections偶数行反转?(学的)
使用LinkedList特性模拟双端队列
时间复杂度 O(N) : N 为二叉树的节点数量,即 BFS 需循环 N 次,占用 O(N) ;双端队列的队首和队尾的添加和删除操作的时间复杂度均为 O(1)
空间复杂度 O(N) : 最差情况下,即当树为满二叉树时,最多有 N/2 个树节点 同时 在 deque 中,使用 O(N) 大小的额外空间。
优化,一次循环奇数偶数层同时进行
奇数层:从左向右打印,先左后右加入下层节点
偶数层:从右向左打印,先右后左加入下层节点
和上一题差不多,只不过在这一题填加一个变量用来判别是奇数行和偶数行
时间复杂度O(n) 空间复杂度O(n)