class Solution {
public int[] levelOrder(TreeNode root) {
if (root == null) return new int[0];
Queue<Integer> v = new LinkedList<>();
Queue<TreeNode> q = new LinkedList<>();
q.add(root);
while (!q.isEmpty()) {
TreeNode p = q.poll();
v.add(p.val);
if (p.left != null) q.add(p.left);
if (p.right != null) q.add(p.right);
}
int[] ans = new int[v.size()];
for (int i = 0; i < ans.length; i++) {
ans[i] = v.poll();
}
return ans;
}
}
# 需要指针
def levelOrder(root: TreeNode):
arr = [root]
res = [root.val]
# 指针,指针从左往右遍历list
point = 0
while not point > len(arr)-1:
if arr[point].left:
arr.append(arr[point].left)
res.append(arr[point].left.val)
if arr[point].right:
arr.append(arr[point].right)
res.append(arr[point].right.val)
point += 1
return res
class Solution {
public int[] levelOrder(TreeNode root) {
if(root==null){
return new int[0];
}
//存放最后的结果的数组
List<Integer> res = new LinkedList<>();
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while (!queue.isEmpty()){
TreeNode node = queue.poll();
//当每次从队列当中弹出元素的时候,将元素放在结果集的数组当中
res.add(node.val);
if (node.left!=null){
queue.offer(node.left);
}
if (node.right!=null){
queue.offer(node.right);
}
}
int[] ans = new int[res.size()];
for (int i = 0; i < res.size(); i++) {
ans[i]=res.get(i);
}
return ans;
}
}
class Solution:
def levelOrder(self, root: TreeNode) -> List[int]:
if not root:return []
res,queue=[],collections.deque()
queue.append(root)
while queue:
node=queue.popleft()
res.append(node.val)
if node.left:queue.append(node.left)
if node.right:queue.append(node.right)
return res
class Solution:
def levelOrder(self, root: TreeNode) -> List[int]:
if not root:
return []
s = []
stack = [root]
while stack:
v = stack.pop(0)
s.append(v.val)
if v.left:
stack.append(v.left)
if v.right:
stack.append(v.right)
return s
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;
}
必须含有中文
class Solution:
def levelOrder(self, root: TreeNode) -> List[int]:
if not root:
return []
res, q = [], collections.deque()
q.append(root)
while q:
node = q.popleft()
res.append(node.val)
if node.left:
q.append(node.left)
if node.right:
q.append(node.right)
return res
class Solution:
def levelOrder(self, root: TreeNode) -> List[int]:
res = []
if not root:
return []
queue = [root]
while queue:
cur_node = queue.pop(0)
res.append(cur_node.val)
if cur_node.left:
queue.append(cur_node.left)
if cur_node.right:
queue.append(cur_node.right)
return res
class Solution:
def levelOrder(self, root: TreeNode) -> List[int]:
if not root: return []
num = [root]
res = [root.val]
while num:
k = []
for i in num:
if i.left:
k.append(i.left)
res.append(i.left.val)
if i.right:
k.append(i.right)
res.append(i.right.val)
num = k
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 int[] levelOrder(TreeNode root) {
if (root == null) {
return new int[0];
}
Queue<TreeNode> queue = new LinkedList<>();
List<Integer> res = new ArrayList<>();
queue.add(root);
while (!queue.isEmpty()) {
TreeNode t = queue.poll();
res.add(t.val);
if (t.left != null) {
queue.add(t.left);
}
if (t.right != null) {
queue.add(t.right);
}
}
int[] arr = new int[res.size()];
for (int i = 0; i < res.size(); i++) {
arr[i] = res.get(i);
}
return arr;
}
}
共以下 49 个回答
注意子节点不为空才能添加进去
时间复杂度O(N) BFS
时间O(n)空间O(n)
时间复杂度:O(n)
空间复杂度:O(n)
因为C语言写这个东西太难写了,所以最近学了python3来写这些题目
collections模块是一个双端队列,可以用于模拟 栈 队列等等数据结构,很好用,python真的是太简便太好用了
时间复杂度:O(n)
空间复杂度:O(n)
时间复杂度:O(n)
空间复杂度:O(n)
层次遍历
时间复杂度:O(n)
空间复杂度:O(n)
思路:使用辅助队列
时间复杂度 O(N): NNN 为二叉树的节点数量,即BFS需循环N次。
空间复杂度 O(N) : 最差情况下,即当树为平衡二叉树时,最多有 N/2个树节点同时在 queue 中,使用 O(N)大小的额外空间。
层序遍历,用一个队列来存放节点,最后从list转为int[],试了一下用stream去转,发现效率还不如遍历
层序遍历
需要使用一个堆,来暂时存放一层节点
通过两个前序遍历,一个获取下一层的节点所以,另一个添加该层的值到 result 中。
时间复杂度O(n)
空间复杂度O(n)
时间复杂度 O(n)
使用层序遍历,时间O(n),空间O(n)
时间复杂度:O(n)
空间复杂度:O(1) (返回值不计入空间复杂度)
时间复杂度on
下面代码
思路:广度优先搜索,用一个队列,先把根节点加入到队列中,从队列取出一个节点加入到结果集中,再看它的左右子节点是否为空,不为空,就加入到队列中,不断循环,直到队列为空,因为队列是先入先出,所以这样结果集中节点的顺序就是层次遍历的顺序了。时间复杂度O(N),空间复杂度取决于队列中最多存放的那一次节点个数。
队列
队列
解题思路:
借助 队列 的先入先出特性来实现
//队列
class Solution {
public:
};
定义队列存放树的各个节点,list集合存放val,由于队列先进先出,所以循环遍历,挨个添加TreeNode,最后将list的val存入数组
时间O(n)
空间O(n)
空间时间复杂度均为O(n)
时间复杂度空间复杂度都为O(n)
解题思路:从上层至下层打印,二叉树广度优先搜索,借用队列先入先出的特性来实现。初始化一个集合用于存放二叉树结点的val值,最后将值在循环条件存入数组,最后将数组的值返回
1、从根节点开始,将子树放在队列,从左到右遍历一层子树同时将下一层子树依次入队
2、时间O(n),空间O(n)
解题思路:借助队列使用广度优先方法对二叉树进行遍历
时间复杂度:O(n)
空间复杂度:O(n),最差情况,平衡二叉树时,有n/2个节点位于队列中
改良迭代求深度的方法,把每次迭代的值记录下来,然后返回 时间复杂度O(n),空间复杂度O(n)
广度优先搜索(BFS)通常借助队列先进先出的的特性来实现
时间:O(n),空间:O(n)
时间复杂度O(n)遍历每个节点 空间复杂度O(N)使用辅助队列和链表
1、从上到下打印二叉树用队列来解决,定义一个存放树节点的队列
2、先将树的根节点存入队列中,当队列不为空时,将队列中的队首元素取出,并将其值存入到vector中,同时将该节点的左右子节点存入到队列中
3、时间复杂度O(n) 空间复杂度O(n)