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);
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;
ans.add(res);
}
return ans;
}
}
def levelOrder(self, root: TreeNode):
if root == None:
return []
res = []
# 利用队列
queue = [root]
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:]
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)
while queue:
node=queue.popleft()
tmp.append(node)
level.append(node.val)
if not queue:
for _ in range(len(tmp)):
node=tmp.popleft()
if node.left:queue.append(node.left)
if node.right:queue.append(node.right)
res.append(level)
level=[]
return res
class Solution {
public List> levelOrder(TreeNode root) {
List> res = new ArrayList<>();
Queue que = new LinkedList<>();
if (root == null)
return res;
que.add(root);
while (!que.isEmpty()) {
int size = que.size();
List list = new ArrayList();
for (int i = 0; i < size; i++) {
TreeNode node = que.poll();
list.add(node.val);
if (node.left != null)
que.add(node.left);
if (node.right != null)
que.add(node.right);
}
res.add(list);
}
return res;
}
}
class Solution:
def levelOrder(self, root: TreeNode) -> List[List[int]]:
if not root:
return []
stack = [root]
res = []
while stack:
tmp = []
for _ in range(len(stack)):
node = stack.pop(0)
tmp.append(node.val)
if node.left:
stack.append(node.left)
if node.right:
stack.append(node.right)
res.append(tmp)
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<>();
queue.add(root);
while (!queue.isEmpty()){
int k=queue.size();
List<Integer> tmp=new ArrayList<>();
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);
}
res.add(tmp);
}
return res;
}
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> res = new ArrayList<>();
Queue<TreeNode> que = new LinkedList<>();
if(root == null) return res;
que.add(root);
while(!que.isEmpty()){
int len = que.size();
List<Integer> list = new ArrayList<>();
for(int i = 0;i<len;i++){
TreeNode pre = que.poll();
list.add(pre.val);
if(pre.left!=null) que.add(pre.left);
if(pre.right!=null) que.add(pre.right);
}
res.add(list);
}
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)
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
class Solution:
def levelOrder(self, root: TreeNode) -> List[List[int]]:
if not root: return []
num = [root]
res = [[root.val]]
while num:
k,tem= [],[]
for i in num:
if i.left:
k.append(i.left)
tem.append(i.left.val)
if i.right:
k.append(i.right)
tem.append(i.right.val)
num = k
if tem :res.append(tem)
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<>();
queue.add(root);
while (!queue.isEmpty()) {
int k = queue.size();
List<Integer> tmp = new ArrayList<>();
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);
}
}
res.add(tmp);
}
return res;
}
}
共以下 48 个回答
每次只取队列里面原有个数的元素
注意 root 为 null 的情况
O(n)O(n)
时间复杂度:O(n)
空间复杂度:O(n)
因为每行打印完之后需要加一个判断,所以按照原来的出一个入一双的做法,肯定不行,那么就应该需要一个队列来存储出的这些东东。而int的list也需要一个来辅助一下,这样方便一些。
时间复杂度:O(n)
空间复杂度:O(n)
需要注意的是:python中的list的appnd方法是浅拷贝,所以不能用 list.clear() 方法在每次append到res之后清空level list,需要让level list重新指向一片空列表区域。
时间复杂度 O(N)
空间复杂度 O(N)
时间复杂度 O(N)
空间复杂度 O(N)
思路:使用辅助队列,同时另设一个size来记录每层的个数
时间复杂度 O(N): N为二叉树的节点数量,即BFS需循环N次。
空间复杂度 O(N) : 最差情况下,即当树为平衡二叉树时,最多有 N/2个树节点同时在 queue 中,使用 O(N)大小的额外空间。
重新定义一个List存每层的元素
层寻遍历不变,
加上一个变量进行每一层反转
修改上一问把每层单独添加元素改为直接添加存放该层val的容器。
时间复杂度O(n)
空间复杂度O(n)
时间复杂度O(n) 空间复杂度O(n)
时间复杂度 O(n)
时间O(n),空间O(n)
时间复杂度:O(n)
空间复杂度:O(n)
思路一:BFS。中间需要用一个int变量count记录每一层节点的个数。时间复杂度O(N),空间复杂度取决于队列中最大存放节点个数。
思路二:DFS。时间复杂度O(N),其中每个节点都被遍历一次,空间复杂度O(N),递归函数被调用了N次。
下面代码
时间:O(n)
空间:O(n)
“`c++> levelOrder(TreeNode* root) {> result; queue;
class Solution {
public:
vector
vector
queue
if (!root) return result;
queue.push(root);
};
“`
时间复杂度O(n)
空间复杂度O(n)
1.一层的拿一个数组来集合出来,就用for(int i=queue.size();i>0;i–){}
解题思路:
1、按层打印: 题目要求的二叉树的 从上至下 打印(即按层打印),又称为二叉树的 广度优先搜索(BFS)。BFS 通常借助 队列 的先入先出特性来实现。
2、每层打印到一行: 将本层全部节点打印到一行,并将下一层全部节点加入队列,以此类推,即可分为多行打印。
从根开始,把下一层子树遍历完,把再下一层的子树存到队列,如此往复,直到最后一层没有子树、导致队列为空,退出
时间O(n),空间O(n)
//递归> res;{}); > levelOrder(TreeNode* root) {
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;
}
vector<vector
fun(root,0);
return res;
};
记录每层长度
定义队列和集合,队列存放节点,先是while循环,然后内部for遍历完树的某一层,并且添加新的左右节点到队列中,每次for循环完,添加数据到集合list中
时间O(n)
空间O(n)
时间空间复杂度为O(n)
时间复杂度O(n) 空间复杂度 O(n)
解题思路:同样借助队列使用广度优先遍历二叉树,同时对于每一层节点嵌套进行循环遍历,将每一层的节点值加入一个列表中,单层循环结束后再加入result列表中。
时间复杂度:O(n),每个节点进出队列一次
空间复杂度:O(n),队列中最多节点数量为n/2个
思路还是迭代,和上一个题的区别,就是子树需要额外的一个链表去存起来,然后再添加到返回列表里面 时间复杂度O(n),空间复杂度O(2n)
注意在内层队列赋值的循环中,不能直接将循环的判断条件写成queue.size(),因为在每次循环内部queue的容量发生了变化
时间:O(n),空间:O(n)
利用队列层次遍历
时间复杂度O(N)空间复杂度O(N)
递归
和上一题思路差不多,只不过这次利用一个for循环让每一行树节点分别输出到一个数组中
时间复杂度O(n) 空间复杂度O(n)