0%

2415. 反转二叉树的奇数层

2415.反转二叉树的奇数层

题目描述:

给你一棵 完美 二叉树的根节点 root ,请你反转这棵树中每个 奇数 层的节点值。

  • 例如,假设第 3 层的节点值是 [2,1,3,4,7,11,29,18] ,那么反转后它应该变成 [18,29,11,7,4,3,1,2]

反转后,返回树的根节点。

完美 二叉树需满足:二叉树的所有父节点都有两个子节点,且所有叶子节点都在同一层。

节点的 层数 等于该节点到根节点之间的边数。

数据范围:

$1\le n \le 2^{14}$

题解:

bfs:

直接层次遍历,把奇数层的存起来,然后翻转。

dfs:

传入两个指针,表示可能需要交换的节点。然后每次按照对称顺序继续遍历。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
auto optimize_cpp_stdio = []()
{
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cout.tie(nullptr);
return 0;
}();
class Solution
{
public:
const static int maxn = 1e5 + 10;
const static int maxm = 1e5 + 10;
const int INF = 0x3f3f3f3f;
TreeNode *reverseOddLevels(TreeNode *root)
{
queue<TreeNode *> q;
q.push(root);
int dep = 0;
while (q.size())
{
int size = q.size();
dep++;
if (dep & 1)
{
vector<TreeNode *> v;
for (int i = 0; i < size; ++i)
{
auto out = q.front();
v.emplace_back(out);
q.pop();
if (!out->left)
q.push(out->left);
if (!out->right)
q.push(out->right);
}
for (int i = 0; i < v.size() / 2; ++i)
{
swap(v[i]->val, v[v.size() - i - 1]->val);
}
}
else
{
for (int i = 0; i < size; ++i)
{
auto out = q.front();
q.pop();
if (!out->left)
q.push(out->left);
if (!out->right)
q.push(out->right);
}
}
}
return root;
}
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
auto optimize_cpp_stdio = []()
{
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cout.tie(nullptr);
return 0;
}();
class Solution
{
public:
const static int maxn = 1e5 + 10;
const static int maxm = 1e5 + 10;
const int INF = 0x3f3f3f3f;
void dfs(TreeNode *left, TreeNode *right, bool flag)
{
if (left == nullptr)
return;
if (flag)
swap(left->val, right->val);
dfs(left->left, right->right, !flag);
dfs(left->right, right->left, !flag);
}
TreeNode *reverseOddLevels(TreeNode *root)
{
dfs(root->left, root->right, true);
return root;
}
};