“`java
与前一题一样,层序遍历,只是一层需要在一起
class Solution {
public List> decorateRecord(TreeNode root) {
if (root == null) {
return new ArrayList<>();
}
List> res = new ArrayList<>();
Queue q = new LinkedList<>();
q.add(root);
while(!q.isEmpty()) {
List list = new ArrayList<>();
int n = q.size();
for (int i = 0; i < n; i++) {
TreeNode node = q.poll();
list.add(node.val);
if (node.left != null) {
q.add(node.left);
}
if (node.right != null) {
q.add(node.right);
}
}
res.add(list);
}
return res;
}
}
“`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<>();
}
Queue queue = new LinkedList<>();
List> res = new ArrayList<>();
queue.offer(root);
while(!queue.isEmpty()){
int k = queue.size();
List pre = new ArrayList<>();
for(int i=0;i }
return res;
}
“`java
通过队列遍历每层的数据,然后加入到数组中
class Solution{
public List> levelOrder(TreeNode root){
if(root == null){
return new ArrayList<>();
}
Queue queue = new LinkedList<>();
List> res = new ArrayList<>();
queue.add(root);
while(!queue.isEmpty()){
int k = queue.size();
List tmp = new ArrayList<>();
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 levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
res = []
if not root:
return res
queue = deque([root])
while queue:
cnt = len(queue)
level = []
for i in range(cnt):
cur = queue.popleft()
level.append(cur.val)
if cur.left:
queue.append(cur.left)
if cur.right:
queue.append(cur.right)
res.append(level)
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<>();
while(!queue.isEmpty()){
int k = queue.size();
List<Integer> ans = new ArrayList<>();
for (int i = 0; i < k; i++) {
TreeNode t = queue.poll();
ans.add(t.val);
if (null != t.left) queue.add(t.left);
if (null != t.right) queue.add(t.right);
}
res.add(ans);
}
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) {
List<List<Integer>> lists = new ArrayList<List<Integer>>();
if (root == null){
return lists;
}
ArrayDeque<TreeNode> nodes = new ArrayDeque<>();
nodes.offer(root);
while (!nodes.isEmpty()){
LinkedList<Integer> res = new LinkedList<>();
int size = nodes.size();
for (int i = 0; i < size; i++) {
TreeNode cur = nodes.poll();
res.add(cur.val);
if (cur.left != null){
nodes.offer(cur.left);
}
if (cur.right != null) {
nodes.offer(cur.right);
}
}
lists.add(res);
}
return lists;
}
}
共以下 44 个回答
“`java
与前一题一样,层序遍历,只是一层需要在一起
class Solution {
public List
> decorateRecord(TreeNode root) {> res = new ArrayList<>(); q = new LinkedList<>(); list = new ArrayList<>();
if (root == null) {
return new ArrayList<>();
}
List
Queue
q.add(root);
while(!q.isEmpty()) {
List
int n = q.size();
for (int i = 0; i < n; i++) { TreeNode node = q.poll(); list.add(node.val); if (node.left != null) { q.add(node.left); } if (node.right != null) { q.add(node.right); } } res.add(list); } return res; } }
“`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) { queue = new LinkedList<>();
if(root==null){
return new ArrayList<>();
}
Queue
List
> res = new ArrayList<>(); pre = new ArrayList<>();
queue.offer(root);
while(!queue.isEmpty()){
int k = queue.size();
List
for(int i=0;i
} return res; }}
分层
“`java
有时间了慢慢补回来,加油!
public List
> levelOrder(TreeNode root) {
if(root==null) return new ArrayList<>();
“`java
通过队列遍历每层的数据,然后加入到数组中
class Solution{
public List
> levelOrder(TreeNode root){ queue = new LinkedList<>();
if(root == null){
return new ArrayList<>();
}
Queue
List
> res = new ArrayList<>(); tmp = new ArrayList<>();
queue.add(root);
while(!queue.isEmpty()){
int k = queue.size();
List
for(int i =0;i
思路:相比于上一题需要多循环一层
时间复杂度O(n),空间复杂度O(n)
C++实现
通过队列遍历每层的数据,然后加入到数组中
【思路】利用C++ STL的queue库,在大循环的循环体中对每一层进行遍历,小循环的循环体中对每一层的每个节点进行遍历
【复杂度】时间/空间均为O(n)
代码实现了对二叉树进行层次遍历,将每一层的节点值存储在一个独立的数组中,并将这些数组按层次顺序存储在最终结果的二维数组中。
思路:
这里使用了队列来辅助进行层次遍历。
首先判断根节点是否为空,若为空则返回空结果。
定义一个二维数组 ans 用于存储最终结果。
将根节点入队。
进入循环,直到队列为空。
在每次循环中,先获取当前层的节点个数 size,并创建一个一维数组 arr 用于存储当前层的节点值。
在内层循环中,将队首节点出队,并将其值存入 arr 中,同时将其左子节点和右子节点入队。
遍历完当前层的所有节点后,将 arr 存入最终结果数组 ans。
循环结束后,返回最终结果数组 ans。
这段代码可以输出一个二维数组,其中每个子数组代表二叉树的一层节点值。通过使用队列来辅助实现层次遍历,可以保证先遍历父节点,再遍历子节点,从而保证了层次遍历的顺序性。
队列
时间和空间复杂度都是O(n)
思路:采用层序遍历,同时根据队列辅助数据结构的特性(每层遍历完后,队列中便是下一层的元素),加入List
时间复杂度O(n) 空间复杂度O(n)
时间复杂度为O(n)
空间复杂度为O(n)
bfs
时间:O(n)
空间:O(n)
思路
代码
class Solution {> levelOrder(TreeNode* root) { > res; ans; node = q.front();
public:
vector<vector
vector<vector
queue<TreeNode> q;
if(rootnullptr){
return res;
}
q.push(root);
while(!q.empty()){
int sz = q.size();
vector
for(int i=0;i<sz;i++){
TreeNode
q.pop();
ans.push_back(node->val);
if(node->left) q.push(node->left);
if(node->right) q.push(node->right);
}
res.push_back(ans);
}
return res;
}
};
时间复杂度O(n)
空间复杂度O(n)
时间复杂度O(n)
空间复杂度O(n)
层序遍历
记录每一行的size
思路:每层存一个list,通过遍历获得下一层。
时间复杂度:O(N)
额外空间复杂度:O(N)
执行用时:1 ms, 在所有 Java 提交中击败了78.43%的用户
内存消耗:41 MB, 在所有 Java 提交中击败了77.57%的用户
c++层序遍历> levelOrder(TreeNode* root) { >result; temp; tempnode;
比较简单
vector<vector
vector<vector
if(rootNULL)return result;
queue<TreeNode>que;
que.push(root);
while(!que.empty())
{
vector
TreeNode
int len = que.size();
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);
}
result.push_back(temp);
}
return result;
节点和所在层数同时入队,通过数组下标添加节点值
时间复杂度:O(n)
空间复杂度:O(n)
C++实现
层序遍历,利用队列NULL值隔离每层元素
时间复杂度O(n)
时空复杂度O(n)
1、每一层都用一个列表进行保存,
2、队列不为空时遍历,遍历当前队列中每个元素,每出队列一个元素,就把其入临时列表存储,将它的左右孩子入队列
3、每一层遍历结束,将临时列表加入返回列表中
要分别记录每一层的值,因此需要获得每一层的节点数。
C++实现> levelOrder(TreeNode* root) { > res; vec; node = que.front();
class Solution {
public:
vector<vector
vector<vector
res.clear();
if(root NULL) return res;
queue<TreeNode> que;
que.push(root);
while(!que.empty())
{
int size = que.size();
vector
for(int i = 0;i < size;i++)
{
TreeNode
int value = que.front()->val;
vec.push_back(value);
que.pop();
if(node->left) que.push(node->left);
if(node->right) que.push(node->right);
}
res.push_back(vec);
}
return res;
}
};
标记层中的最后一个节点,第一层的最后一个节点显然是 root
在遍历本层的时候,标记下一层最后的那个节点。到了本层最后一个节点,就把本层向量并入答案向量
这个做法时间复杂度O(n) 空间复杂度O(n)
看了下面的做法,发现队列中的节点数(队列仅含某一层节点时)可以作为遍历条件,比这个方法要好…
时间复杂度O(n)
空间复杂度O(n)
时间复杂度:O(n)
空间复杂度:O(n)
法1
法2:
上面两种方法的时间复杂度和空间复杂度都是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)