题目
题解
BFS
最简单的思路,bfs层次遍历,奇数层转存为数组,然后对数组内结点的值进行翻转。
class Solution {
public TreeNode reverseOddLevels(TreeNode root) {
Queue<TreeNode>queue=new LinkedList<>();
queue.offer(root);
int level=0;
while(!queue.isEmpty()){
int sk=queue.size();
List<TreeNode>list=new ArrayList<>();
for(int i=0;i<sk;i++){
TreeNode p=queue.poll();
if(level%2==1){
list.add(p);
}
if(p.left!=null){
queue.offer(p.left);
queue.offer(p.right);
}
}
reverse(list);
level++;
}
return root;
}
public void reverse(List<TreeNode>list){
int n=list.size();
if(n==0)
return;
for(int i=0;i<n/2;i++){
TreeNode p=list.get(i);
TreeNode q=list.get(n-i-1);
int tmp=p.val;
p.val=q.val;
q.val=tmp;
}
return;
}
}
时间复杂度: O ( n 2 ) O(n^2) O(n2)
空间复杂度: O ( n ) O(n) O(n)
DFS
还可以用递归dfs的方法做,更简单但是需要递归的技巧
class Solution {
public TreeNode reverseOddLevels(TreeNode root) {
dfs(root.left,root.right,true);
return root;
}
public void dfs(TreeNode l,TreeNode r,boolean isOddLevel){
if(l==null)
return;
if(isOddLevel){
int tmp=l.val;
l.val=r.val;
r.val=tmp;
}
dfs(l.left,r.right,!isOddLevel);
dfs(r.left,l.right,!isOddLevel);
}
}
时间复杂度: O ( h ) O(h) O(h)
空间复杂度: O ( h ) O(h) O(h)
p.s 今天第一次做周赛,只ac了两道,卡在了第三道上。哎,leetcode道阻且长啊