LeetCode 6182. 反转二叉树的奇数层
https://leetcode.cn/problems/reverse-odd-levels-of-binary-tree/
BFS
代码较长
class Solution {
public TreeNode reverseOddLevels(TreeNode root) {
Deque<TreeNode> deque = new LinkedList<>();
deque.offer(root);
int count = 0;
while (!deque.isEmpty()) {
int[] vals = null;
boolean f = count % 2 == 1;
count++;
if (f) {
vals = new int[deque.size()];
int i = 0;
for (TreeNode node : deque) {
vals[i++] = node.val;
}
}
int n = deque.size();
for (int i = 0, j = n - 1; i < n; i++, j--) {
TreeNode node = deque.pollFirst();
if (node.left != null) {
deque.offer(node.left);
}
if (node.right != null) {
deque.offer(node.right);
}
if (f) {
node.val = vals[j];
}
}
}
return root;
}
}
DFS 镜像搜索
代码量少很多。
左子树按照中左右遍历,右子树按照中右左遍历。
当为奇数层时交换当前节点的值。
class Solution {
private void dfs(TreeNode a, TreeNode b, int d) {
if (a == null) {
return ;
}
if (d % 2 == 1) {
int t = a.val;
a.val = b.val;
b.val = t;
}
dfs(a.left, b.right, d + 1);
dfs(a.right, b.left, d + 1);
}
public TreeNode reverseOddLevels(TreeNode root) {
dfs(root.left, root.right, 1);
return root;
}
}