## 题目地址 https://leetcode.com/problems/invert-binary-tree/description/ ## 题目描述 ``` Invert a binary tree. Example: Input: 4 / \ 2 7 / \ / \ 1 3 6 9 Output: 4 / \ 7 2 / \ / \ 9 6 3 1 Trivia: This problem was inspired by this original tweet by Max Howell: Google: 90% of our engineers use the software you wrote (Homebrew), but you can’t invert a binary tree on a whiteboard so f*** off. ``` ## 思路 遍历树(随便怎么遍历),然后将左右子树交换位置。 ## 关键点解析 - 递归简化操作 - 如果树很高,建议使用栈来代替递归 - 这道题目对顺序没要求的,因此队列数组操作都是一样的,无任何区别 ## 代码 * 语言支持:JS,Python,C++ Javascript Code: ```js /* * @lc app=leetcode id=226 lang=javascript * * [226] Invert Binary Tree * * https://leetcode.com/problems/invert-binary-tree/description/ * * algorithms * Easy (57.14%) * Total Accepted: 311K * Total Submissions: 540.6K * Testcase Example: '[4,2,7,1,3,6,9]' * * Invert a binary tree. * * Example: * * Input: * * * ⁠ 4 * ⁠ / \ * ⁠ 2 7 * ⁠/ \ / \ * 1 3 6 9 * * Output: * * * ⁠ 4 * ⁠ / \ * ⁠ 7 2 * ⁠/ \ / \ * 9 6 3 1 * * Trivia: * This problem was inspired by this original tweet by Max Howell: * * Google: 90% of our engineers use the software you wrote (Homebrew), but you * can’t invert a binary tree on a whiteboard so f*** off. * */ /** * Definition for a binary tree node. * function TreeNode(val) { * this.val = val; * this.left = this.right = null; * } */ /** * @param {TreeNode} root * @return {TreeNode} */ var invertTree = function(root) { if (!root) return root; // 递归 // const left = root.left; // const right = root.right; // root.right = invertTree(left); // root.left = invertTree(right); // 我们用stack来模拟递归 // 本质上递归是利用了执行栈,执行栈也是一种栈 // 其实这里使用队列也是一样的,因为这里顺序不重要 const stack = [root]; let current = null; while ((current = stack.shift())) { const left = current.left; const right = current.right; current.right = left; current.left = right; if (left) { stack.push(left); } if (right) { stack.push(right); } } return root; }; ``` Python Code: ```python # Definition for a binary tree node. # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution: def invertTree(self, root: TreeNode) -> TreeNode: if not root: return None stack = [root] while stack: node = stack.pop(0) node.left, node.right = node.right, node.left if node.left: stack.append(node.left) if node.right: stack.append(node.right) return root ``` C++ Code: ```C++ /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: TreeNode* invertTree(TreeNode* root) { if (root == NULL) return root; auto q = queue(); q.push(root); while (!q.empty()) { auto n = q.front(); q.pop(); swap(n->left, n->right); if (n->left != nullptr) { q.push(n->left); } if (n->right != nullptr) { q.push(n->right); } } return root; } }; ```