/**
* 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 LinkedList<>();
int sum = 1;
queue.add(root);
while(!queue.isEmpty()){
int k = queue.size();
LinkedList<Integer> temp = new LinkedList<>();
for(int i = 0;i<k;i++){
TreeNode t = queue.poll();
if(sum%2==1){ //奇数层
temp.add(t.val);
}else{
temp.addFirst(t.val);
}
if(t.left != null)queue.add(t.left);
if(t.right != null)queue.add(t.right);
}
res.add(temp);
sum++;
}
return res;
}
}
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> res = new ArrayList<>();
if (root==null)
return res;
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
//flag为1正序,为-1逆序,轮换正负做标记
int flag = 1;
while (!queue.isEmpty()) {
List<Integer> list = new ArrayList<>();
int k = queue.size();
for (int i = 0; i < k; i++) {
TreeNode poll = queue.poll();
list.add(poll.val);
if (poll.left!=null) queue.offer(poll.left);
if (poll.right!=null) queue.offer(poll.right);
}
if (flag==1) {
res.add(list);
flag=flag*-1;
} else if (flag==-1) {
List<Integer> list1 = new ArrayList<>(list.size());
for (int i = list.size()-1; i >= 0; i--) {
list1.add(list.get(i));
}
res.add(list1);
flag=flag*-1;
}
}
return res;
}
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
import "container/list"
func reverseArray(arr []int) {
n := len(arr)
for i, j := 0, n-1; i < j; i, j = i+1, j-1 {
arr[i], arr[j] = arr[j], arr[i]
}
}
func levelOrder(root *TreeNode) [][]int {
var ans [][]int
if root == nil {
return ans
}
var deep int = 0
var queue = list.New()
queue.PushBack(root)
for queue.Len() != 0 {
size := queue.Len()
var tmp []int
for i:=0 ; i< size ; i++ {
node := queue.Front().Value.(*TreeNode)
queue.Remove(queue.Front())
tmp = append(tmp,node.Val)
if node.Left != nil {
queue.PushBack(node.Left)
}
if node.Right != nil {
queue.PushBack(node.Right)
}
}
if deep % 2 == 1 {
reverseArray(tmp) //逆序
}
deep++
ans = append(ans,tmp)
}
return ans
}
八
/**
* 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> levelOrder(TreeNode root) {
Queue queue = new LinkedList<>();
List<List> res = new ArrayList<>();
if (root != null) queue.add(root);
while (!queue.isEmpty()) {
LinkedList tmp = new LinkedList<>();
for (int i = queue.size(); i > 0; i–) {
TreeNode node = queue.poll();
if (res.size() % 2 0) tmp.add(node.val);
else tmp.addFirst(node.val);
if (node.left != null) queue.add(node.left);
if (node.right != null) queue.add(node.right);
}
res.add(tmp);
}
return res;
}
}
共以下 30 个回答
ts
//用双端队列> zigzagLevelOrder(TreeNode root) {> ans;
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<vector
vector<vector
if (!root) {
return ans;
}
};
时间复杂度:O(n)
空间复杂度:O(n)
时间空间复杂度:O(n)
在第二题的基础上加个行数的判断> cc;> levelOrder(TreeNode root) lever;
class Solution
{
vector<vector
queue<TreeNode> Inqueue;
public:
vector<vector
{
if(!root) return cc;
Inqueue.push(root);
int tt;
while(Inqueue.size())
{
int l=Inqueue.size();
vector
};
“`c++> levelOrder(TreeNode* root) {> res; q; lev;val);
//时间复杂度O(n)
//空间复杂度O(n)
class Solution {
public:
vector
vector
int i;
int judge=1;
if(!root) return res;
queue
q.push(root);
while(!q.empty())
{
int k=q.size();
vector
for(i=0;i
if(tmp->left) q.push(tmp->left);
if(tmp->right) q.push(tmp->right);
}
if(judge%2==0) reverse(lev.begin(),lev.end());//通过奇偶判断反转
res.push_back(lev);
judge++;
}
return res;
}
};
class Solution {> levelOrder(TreeNode root) { > reuslt =new ArrayList<List >(); temp ; queue =new LinkedList ();();
public List<List
//通过奇偶判断 翻转
int jude =1;
List<List
List
if(root null) return reuslt;
Queue
queue.add(root);
int i= 1;
while(!queue.isEmpty())
{
i =queue.size();
temp =new ArrayList
while(i>0)
{
TreeNode node =queue.remove();
i–;
if(node.left!=null)
{
queue.add(node.left);
}
if(node.right!=null)
{
queue.add(node.right);
}
temp.add(node.val);
}
if(jude%2!=1)
{
Collections.reverse(temp);
}
时间复杂度O(n),空间复杂度O(n)
”’java> levelOrder(TreeNode root) { > re = new ArrayList<>(); queue = new ArrayDeque<>(); list = new LinkedList<>();
class Solution {
public List<List
List<List
Queue
if(root null){
return re;
}
queue.offer(root);
boolean flag = true;
while(!queue.isEmpty()){
int size = queue.size();
Deque
for(int i = 0;i < size;i++){
TreeNode node = queue.poll();
if(!flag){
list.offerFirst(node.val);
}else{
list.offerLast(node.val);
}
if(node.left != null){
queue.offer(node.left);
}
if(node.right != null){
queue.offer(node.right);
}
}
flag = !flag;
re.add(new ArrayList<>(list));
}
return re;
}
”’
时间复杂度:O(n)
空间复杂度O(n)
代码
II. 从上到下打印二叉树加入一个判断, reverse中间vector即可
用一个变量来控制一下奇偶层
时间复杂度:O(n)
空间复杂度:O(n)
思路
一样是层序遍历,需要做的就是控制从左到右还是从右到左,这个通过一个flag来控制。
需要注意的是,每一行的val值不再通过vector来进行存储,因为vector只能push_back,这里采用deque双向队列来实现,deque能够实现push_back和push_front。
然后通过vector\<int>把deque的类型进行强转,存入ans
代码
Day8:下面是代码
时间复杂度:O(n)
空间复杂度:O(n)
也可以用双端队列, 双O(n)
八> levelOrder(TreeNode root) { queue = new LinkedList<>();> res = new ArrayList<>(); tmp = new LinkedList<>();
/**
* 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
Queue
List<List
if (root != null) queue.add(root);
while (!queue.isEmpty()) {
LinkedList
for (int i = queue.size(); i > 0; i–) {
TreeNode node = queue.poll();
if (res.size() % 2 0) tmp.add(node.val);
else tmp.addFirst(node.val);
if (node.left != null) queue.add(node.left);
if (node.right != null) queue.add(node.right);
}
res.add(tmp);
}
return res;
}
}
这题稍微复杂一点,对打印顺序有了要求。
说重点:
对层数进行判断,分奇数层偶数层来进行相应操作
可以从队列加入或删除的顺序来控制,这里用双端队列是很好的选择。
也可以从集合的加入顺序来控制,LinkedList在这里使用再合适不过,它可以头插,也可以尾插。
我个人认为第2种方法,更加简洁。
贴两种方法
控制集合加入的顺序
控制队列加入和删除的顺序
写在最后:选择合适的数据结构解题很重要!