“`java
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List> levelOrder(TreeNode root) {
if(root==null){
return new ArrayList<>();
}
List> res = new ArrayList<>();
Queue queue = new LinkedList<>();
int num = 0;
queue.offer(root);
while(!queue.isEmpty()){
LinkedList tmp = new LinkedList<>();
int k = queue.size();
for(int i=0;ireturn res;
“`java
//时间复杂度为O(n) 空间复杂度为 O(n)
class Solution {
public List> levelOrder(TreeNode root) {
if(root==null) return new ArrayList<>();
int sum=1;
Queue queue = new LinkedList();
List> res= new ArrayList<>();
queue.add(root);
}
///以下为使用栈进行解决
public List<List> levelOrder(TreeNode root) {
if(rootnull) {return new ArrayList<>();}
int sum=1;
Queue queue = new LinkedList();
List<List> res= new ArrayList<>();
queue.add(root);
while(!queue.isEmpty()){
// 里面有K 个则一层有k个
int k= queue.size();
// 边去取一层,边放入 。自己原本的思想是分开处理
List tmp=new ArrayList<Integer>();
// 插入式进行判断
if (sum%2!=0){
for(int i=0;i<k;i++){
TreeNode t=queue.poll();
tmp.add(t.val);
if(t.left!=null) {queue.add(t.left);}
if(t.right!=null) {queue.add(t.right);}
}
}else {
Stack<Integer> integers = new Stack<>();
for (int i = 0; i < k; i++) {
TreeNode t=queue.poll();
integers.push(t.val);
if(t.left!=null) {queue.add(t.left);}
if(t.right!=null) {queue.add(t.right);}
}
while (!integers.isEmpty()){
tmp.add(integers.pop());
}
}
// 循环接触则得到了一层
res.add(tmp);
sum++;
}
return res;
}
“`java
时间复杂度O(n) 空间复杂度0(n)
class Solution{
public List> levelOrdder(TreeNode root){
if(root == null){
return new ArrayList<>();
}
Queue queue = new LinkList<>();
Listres = new ArrrayList<>();
int sum = 1;
queue.add(root);
while(!queue.isEmpty(){
int k = queue.size();
LinkedList tmp = new LinkedList<>();
for(int i =0; i
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
from collections import deque
class Solution:
def zigzagLevelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
res = []
if not root:
return res
q = deque([root])
level = 0
while q:
cur_lst = []
size = len(q)
level += 1
for i in range(size):
cur = q.popleft()
cur_lst.append(cur.val)
if cur.left:
q.append(cur.left)
if cur.right:
q.append(cur.right)
if level % 2 == 0:
cur_lst.reverse()
res.append(cur_lst)
return res
# 记得reverse
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def levelOrder(self, root: TreeNode) -> List[List[int]]:
if not root:
return []
queue = [root]
res = []
flag = True
while queue:
tmp = []
tmp_queue = []
for _ in range(len(queue)):
if flag:
cur_node = queue[0]
queue = queue[1:]
else:
cur_node = queue.pop()
tmp.append(cur_node.val)
if flag:
if cur_node.left:
tmp_queue.append(cur_node.left)
if cur_node.right:
tmp_queue.append(cur_node.right)
else:
if cur_node.right:
tmp_queue.append(cur_node.right)
if cur_node.left:
tmp_queue.append(cur_node.left)
res.append(tmp)
queue = tmp_queue if flag == True else tmp_queue[::-1]
flag = not flag
return res
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
if (null == root) return new ArrayList<>();
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
List<List<Integer>> res = new ArrayList<>();
int height = 1;
while(!queue.isEmpty()){
int k = queue.size();
LinkedList<Integer> ans = new LinkedList<>();
for (int i = 0; i < k; i++){
TreeNode t = queue.poll();
if (height % 2 == 1){
ans.add(t.val);
} else {
ans.addFirst(t.val);
}
if (null != t.left) queue.add(t.left);
if (null != t.right) queue.add(t.right);
}
res.add(ans);
height++;
}
return res;
}
}
共以下 42 个回答
“`java
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List
> levelOrder(TreeNode root) {> res = new ArrayList<>(); queue = new LinkedList<>(); tmp = new LinkedList<>();
if(root==null){
return new ArrayList<>();
}
List
Queue
int num = 0;
queue.offer(root);
while(!queue.isEmpty()){
LinkedList
int k = queue.size();
for(int i=0;i
return res;}
}借助LinkedList的addFirst在前边加入,实现左右便利
原本想的是使用一个栈进行处理,但是后面看到帅地使用 linkedList进行了优化
“`java
//时间复杂度为O(n) 空间复杂度为 O(n)
class Solution {
public List
> levelOrder(TreeNode root) { queue = new LinkedList();
if(root==null) return new ArrayList<>();
int sum=1;
Queue
List
> res= new ArrayList<>();
queue.add(root);
tmp.add(t.val);
}else{
//偶数的是2,从右到左
tmp.addFirst(t.val);
}
}> levelOrder(TreeNode root) { queue = new LinkedList();> res= new ArrayList<>();
///以下为使用栈进行解决
public List<List
if(rootnull) {return new ArrayList<>();}
int sum=1;
Queue
List<List
queue.add(root);
// 插入式进行判断
if (sum%2!=0){
for(int i=0;i<k;i++){
“`java
时间复杂度O(n) 空间复杂度0(n)
class Solution{
public List
> levelOrdder(TreeNode root){ queue = new LinkList<>();
if(root == null){
return new ArrayList<>();
}
Queue
List
res = new ArrrayList<>(); tmp = new LinkedList<>();
int sum = 1;
queue.add(root);
while(!queue.isEmpty(){
int k = queue.size();
LinkedList
for(int i =0; i
时间复杂度O(n,空间复杂度O(n)
C++实现
通过一个数字id来判断是否倒序打印,然后每层储存数值就可以了
【思路】通过result数组的长度来判断当前是第几行,是否需要reverse print,normal print和reverse print分别通过vector的push_back、insert(xx.begin(), val)函数来实现
【复杂度】时间/空间均为O(n)
法一:利用反转标记,调用reverse函数对反转行反转后再插入ans;
法二:利用双端队列,依然设立反转行标记,需要反转的行依次插入双端队列的头部实现反转。
标记
时间复杂度和空间复杂度都是O(N)
思路:按照上一个II版本,加入一个z字走形控制变量,来控制Collection.reverse()来翻转每层元素的列表
时间复杂度O(n) 空间复杂度O(n)
时间复杂度为O(N)
空间复杂度为O(N)
bfs,用size确定每一层节点数,leftToRight表示是否从左向右,若是false,即从右向左,直接将subRes反转即可。
时间:O(n)
空间:O(n)
class Solution {> levelOrder(TreeNode* root) { > res; ans(sz); node = q.front();
public:
vector<vector
vector<vector
queue<TreeNode> q;
if(rootnullptr){
return res;
}
q.push(root);
bool level = true;
while(!q.empty()){
int sz = q.size();
vector
for(int i=0;i<sz;i++){
TreeNode
q.pop();
int index = level? i:sz-i-1;
ans[index] = node->val;
if(node->left) q.push(node->left);
if(node->right) q.push(node->right);
}
level = !level;
res.push_back(ans);
}
return res;
}
};
时间复杂度O(n) 空间复杂度O(n)
思路
代码
第一种做法,使用双向队列,奇数层偶数层在不同方向插入队列
时间复杂度: O(n)
空间复杂度: O(n)
方法二: 正常层序遍历,最后在返回前,将偶数层全部翻转
时间复杂度: O(n)
空间复杂度: O(n)
时间复杂度:O(N)
空间复杂度:O(N)
用临时数组寄存,反向遍历
c++实现,使用双端队列的可能会更好一点,但是我不会> levelOrder(TreeNode* root) { > result; temp; tempNode;
vector<vector
vector<vector
queue<TreeNode>que;
if(rootNULL)return result;
que.push(root);
int deep = 0;
while(!que.empty())
{
int len = que.size();
deep++;
vector
TreeNode
for(int i = 0;i<len;i++)
{
tempNode = que.front();
que.pop();
temp.push_back(tempNode->val);
if(tempNode->left!=NULL)que.push(tempNode->left);
if(tempNode->right!=NULL)que.push(tempNode->right);
}
if(deep%20)
{
reverse(temp.begin(),temp.end());
}
result.push_back(temp);
}
return result;
}
时间复杂度:O(n)
空间复杂度:O(n)
C++实现
层序遍历,利用队列NULL值隔离每层元素,通过Collections.reverse反转list
时空复杂度:O(n)
1、对比于上一道题,需要在奇偶层进行判断是否要对临时链表进行从尾部插入从而实现倒叙输出
用双端队列来实现从左往右和从右往左遍历的效果。
C++实现:> levelOrder(TreeNode* root) { > res; out; node;
class Solution {
public:
vector<vector
vector<vector
if (rootNULL)
return res;
bool flag = true; //从左向右打印为true,从右向左打印为false
deque<TreeNode> q;
q.push_back(root);
while (!q.empty())
{
int n = q.size();
vector
TreeNode
while (n>0)
{
if (flag) // 前取后放:从左向右打印,所以从前边取,后边放入
{
node = q.front();
q.pop_front();
if (node->left)
q.push_back(node->left); // 下一层顺序存放至尾
if (node->right)
q.push_back(node->right);
}
else //后取前放: 从右向左,从后边取,前边放入
{
node = q.back();
q.pop_back();
if (node->right)
q.push_front(node->right); // 下一层逆序存放至首
if (node->left)
q.push_front(node->left);
}
out.push_back(node->val);
n–;
}
flag = !flag;
res.push_back(out);
}
return res;
}
};
双端队列,若该层从左往右打印,则和之前的题一样
如果要求从右往左,则从队列 back 开始取,先右子节点后左子节点从 front 入队
时间复杂度O(n) 空间复杂度O(n)
时间复杂度O(n)
空间复杂度O(n)
时间复杂度:O(n)
空间复杂度:O(n)
时间复杂度:O(n);空间复杂度:O(n)
有点难
复杂度O(n)
复杂度O(n) O(n)
解题方法
复杂度
时间复杂度: $O(n)$
空间复杂度: $O(n)$
Code
class Solution {> levelOrder(TreeNode root) {
public List<List
if(root null){
return new ArrayList<>();
}
}
时间复杂度:O(n)
额外空间复杂度:容器里最多存放 1/2 的节点,故为 O(n)