184 lines
3.7 KiB
Markdown
184 lines
3.7 KiB
Markdown
|
|
|||
|
## 题目地址
|
|||
|
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<TreeNode*>();
|
|||
|
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;
|
|||
|
}
|
|||
|
};
|
|||
|
```
|