【LeetCode-树】翻转二叉树(二叉树的镜像)
题目描述
翻转一棵二叉树。
示例:
输入:
4
/ \
2 7
/ \ / \
1 3 6 9
输出:
4
/ \
7 2
/ \ / \
9 6 3 1
题目链接: https://leetcode-cn.com/problems/invert-binary-tree/
思路1
二叉树的翻转就是将树中所有节点的左右孩子互换。可以使用递归做,也可以使用迭代来做。
写法一
使用递归,代码如下:
/**
* 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==nullptr) return nullptr;
TreeNode* temp = nullptr;
temp = root->left;
root->left = root->right;
root->right = temp;
invertTree(root->left);
invertTree(root->right);
return root;
}
};
或者这样写(虽然基本没有差别):
/**
* 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==nullptr) return nullptr;
if(root->left==nullptr && root->right==nullptr) return root;
swap(root->left, root->right);
root->left = invertTree(root->left);
root->right = invertTree(root->right);
return root;
}
};
- 时间复杂度:O(n)
- 空间复杂度:O(h)
思路2
使用 bfs 进行迭代,入队的时候将对头节点的左右孩子互换之后入队即可(bfs中不用互换)。代码如下:
/**
* 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==nullptr) return root;
queue<TreeNode*> q;
q.push(root);
while(!q.empty()){
TreeNode* curNode = q.front(); q.pop();
swap(curNode->left, curNode->right);
if(curNode->left!=nullptr) q.push(curNode->left);
if(curNode->right!=nullptr) q.push(curNode->right);
}
return root;
}
};
- 时间复杂度:O(n)
- 空间复杂度:O(n)