226. 翻转二叉树 - 力扣(LeetCode) (leetcode-cn.com)
递归翻转二叉树
- 递归遍历
- 翻转
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
if (!root) return root;
// 前序递归
swap(root->left, root->right); // 翻转
invertTree(root->left);
invertTree(root->right);
return root;
}
};
非递归翻转二叉树
DFS
- 非层序 非递归遍历
- 处理部分翻转
class Solution1 {
public:
TreeNode* invertTree(TreeNode* root) {
if (!root) return root;
stack<TreeNode*> stk;
stk.push(root);
while (!stk.empty()) {
TreeNode* node = stk.top();
stk.pop();
if (node != nullptr) {
if (node->right != nullptr) stk.push(node->right);
if (node->left != nullptr) stk.push(node->left);
stk.push(node);
stk.push(nullptr);
}
// 非递归 只在处理部分翻转即可
else {
node = stk.top();
stk.pop();
swap(node->left, node->right);
}
}
return root;
}
};
BFS
- 层序 非递归遍历
- 修改部分翻转
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
queue<TreeNode*> que;
if (root) que.push(root);
while (!que.empty()) {
int size = que.size();
for (int i = 0; i < size; ++i) {
TreeNode* node = que.front();
que.pop();
// 处理部分
swap(node->left, node->right);
if (node->left) que.push(node->left);
if (node->right) que.push(node->right);
}
}
return root;
}
};