描述
翻转一棵二叉树。
示例:
输入:
4
/ \
2 7
/ \ / \
1 3 6 9
输出:
4
/ \
7 2
/ \ / \
9 6 3 1
备注:
这个问题是受到 Max Howell 的 原问题 启发的 :
谷歌:我们90%的工程师使用您编写的软件(Homebrew),但是您却无法在面试时在白板上写出翻转二叉树这道题,这太糟糕了。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/invert-binary-tree/
求解,包含递归和非递归两种实现
class Solution {
public:
// 递归求解,先翻转左右子树,再交换
TreeNode *invertTree_recur(TreeNode *root) {
if (root == nullptr) {
return root;
}
// attention, 如果递归过程中直接对左右子树赋值,则破坏了原有的树结构
// root->left = invertTree(root->right);
// root->right = invertTree(root->left);
invertTree_recur(root->left);
invertTree_recur(root->right);
std::swap(root->left, root->right);
return root;
}
// 非递归求解,层序遍历 + 栈处理
TreeNode *invertTree(TreeNode *root) {
if (root == nullptr) {
return root;
}
// 层序遍历中,将至少有左子树,或者至少有右子树的的节点推入栈中,待交换
std::queue<TreeNode *> q;
q.emplace(root);
std::stack<TreeNode *> s;
while (!q.empty()) {
auto node = q.front();
q.pop();
if (node->left || node->right) {
// 将至少有一个子树的节点推入栈中,待交换,如果是叶子节点则不需要交换
s.emplace(node);
}
if (node->left) {
q.emplace(node->left);
}
if (node->right) {
q.emplace(node->right);
}
}
// 遍历栈,交换非叶子节点
while (!s.empty()) {
auto node = s.top();
s.pop();
std::swap(node->left, node->right);
}
return root;
}
};