// Time: O(n) // Space: O(h) /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ // Time: O(n) // Space: O(w), w is the max number of nodes of the levels. // BFS solution. class Solution { public: TreeNode* invertTree(TreeNode* root) { if (root != nullptr) { queue nodes; nodes.emplace(root); while (!nodes.empty()) { auto node = nodes.front(); nodes.pop(); swap(node->left, node->right); if (node->left != nullptr) { nodes.emplace(node->left); } if (node->right != nullptr) { nodes.emplace(node->right); } } } return root; } }; // Time: O(n) // Space: O(h) // Stack solution. class Solution2 { public: TreeNode* invertTree(TreeNode* root) { if (root != nullptr) { stack nodes; nodes.emplace(root); while (!nodes.empty()) { auto node = nodes.top(); nodes.pop(); swap(node->left, node->right); if (node->left != nullptr) { nodes.emplace(node->left); } if (node->right != nullptr) { nodes.emplace(node->right); } } } return root; } }; // Time: O(n) // Space: O(h) // DFS, Recursive solution. class Solution3 { public: TreeNode* invertTree(TreeNode* root) { if (root != nullptr) { swap(root->left, root->right); invertTree(root->left); invertTree(root->right); } return root; } };