【DFS】这个和对称二叉树一样,也是用一个双节点参数的函数来遍历这棵二叉树,在遍历的过程中交换左右两个节点的值即可。
class Solution {
// 10:57 5
// dfs
void dfs(TreeNode left, TreeNode right, int t) {
if (left == null) return;
if (t % 2 == 1) {
int tmp = left.val;
left.val = right.val;
right.val = tmp;
}
dfs(left.left, right.right, t + 1);
dfs(left.right, right.left, t + 1);
}
public TreeNode reverseOddLevels(TreeNode root) {
dfs(root.left, root.right, 1);
return root;
}
}
【BFS】BFS就是层次遍历,每次把同一层反转过来就好了。
class Solution {
public TreeNode reverseOddLevels(TreeNode root) {
if (root == null) return root;
Deque<TreeNode> queue = new LinkedList();
queue.offer(root);
int d = 0;
while (!queue.isEmpty()) {
int n = queue.size();
while (n-- > 0) {
TreeNode top = queue.poll();
if (top.left != null) queue.offer(top.left);
if (top.right != null) queue.offer(top.right);
}
if (d % 2 == 0) {
List<Integer> list = new ArrayList();
for (var node: queue) list.add(node.val);
int m = list.size() - 1;
for (var node: queue) {
node.val = list.get(m--);
}
}
d++;
}
return root;
}
}