# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution(object):
def decorateRecord(self, root):
"""
:type root: Optional[TreeNode]
:rtype: List[List[int]]
"""
if not root:
return []
res = []
queue = collections.deque()
queue.append(root)
count = 0
while queue:
r = []
count+=1
for _ in range(len(queue)):
tmp = queue.popleft()
if count % 2 == 0:
r.insert(0, tmp.val)
else:
r.append(tmp.val)
if tmp.left:
queue.append(tmp.left)
if tmp.right:
queue.append(tmp.right)
res.append(r)
return res
class Solution {
public:
vector<vector> decorateRecord(TreeNode* root) {
vector<vector> ret;
if (root nullptr) return ret;
deque<TreeNode> de;
de.push_back(root);
int num = 1;
while (!de.empty()){
vector tmp;
if (num % 2 1){//奇数
for (int i = de.size(); i > 0; –i){
TreeNode node = de.front();
de.pop_front();
tmp.push_back(node->val);
if (node->left) de.push_back(node->left);
if (node->right) de.push_back(node->right);
}
}
if (num % 2 == 0){//偶数
for (int i = de.size(); i > 0; --i){
TreeNode* node = de.back();
de.pop_back();
tmp.push_back(node->val);
if (node->right) de.push_front(node->right);
if (node->left) de.push_front(node->left);
}
}
ret.push_back(tmp);
++num;
}
return ret;
}
共以下 32 个回答
/**> decorateRecord(TreeNode root) {
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public List<List
if(root null)return new ArrayList<>();
}时
class Solution {> decorateRecord(TreeNode root) { > res = new ArrayList(); queue = new LinkedList(); tmp = new LinkedList();
public List<List
List<List
Queue
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.addLast(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;
}
}时间空间复杂度O(n)
~~~java> decorateRecord(TreeNode root) {>();
class Solution {
public List<List
if(rootnull) {
return new ArrayList<List
}
}
java
根据上一题加个栈进行判定
这题其实说难不难,说简单也不算简单,我觉得关键的地方在于你有没有做过前两道题,如果你做过前两道题,那么这题基本就是白给,很快就做出来了,就是多加了一个sum去判断奇偶层,因为奇层和偶层的逻辑不一样。但如果没做过前两道题,那这题基本上是做不出来的,我也是昨天把前两道题看了一下,然后今天再复习一遍,才做的这道题。不过做的时候也磕磕绊绊,要多次看一下答案才能勉强做出来。> levelOrder(TreeNode root) {
public List<List
if(root null){
return new ArrayList<>();
}
class Solution {> decorateRecord(TreeNode* root) { > arr; que;
public:
vector<vector
vector<vector
queue
if(root != nullptr) que.push(root);
};
第n次打卡 如履薄冰
day8第三题
时空复杂度O(n)
剑指 Offer 32 – III. 从上到下打印二叉树java
public List<List> decorateRecord(TreeNode root) { q=new LinkedList<>();> res =new ArrayList<>();tmp =new ArrayList<>(); 0) tmp.addLast(node.val);
Queue
List<List
if(root null) return res;
q.add(root);
while(!q.isEmpty()){
List
for(int i=q.size();i>0;i–){
TreeNode node = q.poll();
if(res.size() % 2
else tmp.addFirst(node.val);
if(node.left != null) q.add(node.left);
if(node.right != null) q.add(node.right);
}
res.add(tmp);
}
return res;
}
思路:双端队列实现左右顺序互换,用res的奇偶层数确定遍历的方向
广度优先算法,注意下每层转换下输出顺序,使用一个布尔值判断
时间复杂度O(N)
空间复杂度O(N)
class Solution {> decorateRecord(TreeNode* root) {
public:
vector<vector
if (!root) {
return {};
}
};
打卡,和前面一题的主要区别是记录一层节点的顺序
java> decorateRecord(TreeNode root) { queue = new LinkedList<>();> res = new ArrayList<>(); tmp = new LinkedList<>();
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.addLast(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;
}
}
时间复杂度 O(N)
空间复杂度 O(N)
时间复杂度$O(n)$,额外空间复杂度$O(n)$,将第二题的分层子队列改成可以按照层数换向的双端队列即可(由于返回值是List类,需要用List类的实现LinkedList)
时间复杂度:O(n)
额外空间复杂度:容器里最对存放 1/2 的节点,故为 O(n)
时间复杂度O(n)
层序遍历变形
class Solution {> decorateRecord(TreeNode* root) { >res;
public:
vector<vector
vector<vector
queue<TreeNode*>que;
if(rootnullptr)return res;
que.push(root);
int flag=0;
};
//时间复杂度:O(N)
class Solution {> decorateRecord(TreeNode* root) { > ret; tmp; node = de.front();
public:
vector<vector
vector<vector
if (root nullptr) return ret;
deque<TreeNode> de;
de.push_back(root);
int num = 1;
while (!de.empty()){
vector
if (num % 2 1){//奇数
for (int i = de.size(); i > 0; –i){
TreeNode
de.pop_front();
tmp.push_back(node->val);
if (node->left) de.push_back(node->left);
if (node->right) de.push_back(node->right);
};双端队列控制奇偶打印 时空复杂度O(N)
打卡
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
class Solution:
def decorateRecord(self, root: TreeNode) -> List[List[int]]:
if not root: return []
res, deque = [], collections.deque()
deque.append(root)
while deque:
tmp = []
# 打印奇数层
for _ in range(len(deque)):
# 从左向右打印
node = deque.popleft()
tmp.append(node.val)
# 先左后右加入下层节点
if node.left: deque.append(node.left)
if node.right: deque.append(node.right)
res.append(tmp)
if not deque: break # 若为空则提前跳出
# 打印偶数层
tmp = []
for _ in range(len(deque)):
# 从右向左打印
node = deque.pop()
tmp.append(node.val)
# 先右后左加入下层节点
if node.right: deque.appendleft(node.right)
if node.left: deque.appendleft(node.left)
res.append(tmp)
return res
双 o n
/**> decorateRecord(TreeNode root) {> ans; tmp; cur = q.front();
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
#include
class Solution {
public:
vector<vector
deque<TreeNode> q;
vector<vector
if(root != nullptr) q.push_back(root);
while(!q.empty()){
vector
for(int i = q.size(); i > 0; i –){
TreeNode
q.pop_front();
tmp.push_back(cur->val);
if(cur->left != nullptr) q.push_back(cur->left);
if(cur->right != nullptr) q.push_back(cur->right);
}
ans.push_back(tmp);
if(q.empty()) break;
tmp.clear();
for(int i = q.size(); i > 0; i –){
TreeNode* cur = q.back();
q.pop_back();
tmp.push_back(cur->val);
if(cur->right != nullptr) q.push_front(cur->right);
if(cur->left != nullptr) q.push_front(cur->left);
}
ans.push_back(tmp);
}
return ans;
}
};
时空复杂度O(n)
class Solution {> decorateRecord(TreeNode root) { > ans = new ArrayList<>(); stack1 = new Stack<>(); stack2 = new Stack<>(); layer = new ArrayList<>(); layer2 = new ArrayList<>();
public List<List
List<List
if(root null) return ans;
Stack
Stack
stack1.add(root);
while(!stack1.isEmpty()){
List
int len = stack1.size();
for(int i = 0; i < len; i++){
TreeNode temp = stack1.pop();
layer.add(temp.val);
if(temp.left!=null) stack2.push(temp.left);
if(temp.right!=null) stack2.push(temp.right);
}
ans.add(layer);
List
if(stack2.isEmpty())
break;
len = stack2.size();
for(int i = 0; i < len; i++){
TreeNode temp = stack2.pop();
layer2.add(temp.val);
if(temp.right!=null) stack1.push(temp.right);
if(temp.left!=null) stack1.push(temp.left);
}
ans.add(layer2);
}
return ans;
}
//使用两个栈实现
时间复杂度O(n)
空间复杂度O(n)
“`C++> decorateRecord(TreeNode* root)
class Solution {
public:
vector
{
if(root == nullptr)
{
return {};
}
};
“`
class Solution {> decorateRecord(TreeNode root) { > res=new ArrayList<>(); queue=new LinkedList<>(); list_res=new ArrayList<>();
public List<List
List<List
if(rootnull)
{
return res;
}
Queue
queue.offer(root);
int count=queue.size();
boolean flag=true;
while(!queue.isEmpty())
{
List
for(int i=0;i<count;i++)
{
TreeNode node=queue.poll();
list_res.add(node.val);
if(node.left!=null)
queue.offer(node.left);
if(node.right!=null)
queue.offer(node.right);
}
count=queue.size();
if(!flag)
{
Collections.reverse(list_res);
flag=true;
}
else
flag=false;
res.add(list_res);
}
return res;
}
}
维护一个布尔变量,决定当前层的list是否反转顺序
思路:暴力解法:层序遍历,对需要翻转的层单独进行翻转