解题思路1
借助队列的广度优先遍历
代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
queue<TreeNode*> que;//辅助队列
if(root != NULL) que.push(root);
while(!que.empty()){
int size = que.size();
for(int i=0;i<size;i++){
TreeNode* node = que.front();
que.pop();
TreeNode* temp = node->left;
node->left = node->right;
node->right = temp;
if(node->left) que.push(node->left);
if(node->right) que.push(node->right);
}
}
return root;
}
};
执行用时:0 ms, 在所有 C++ 提交中击败了100.00%的用户
内存消耗:9.7 MB, 在所有 C++ 提交中击败了5.23%的用户
通过测试用例:77 / 77
解题思路2
递归
代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
//递归
TreeNode* invertTree(TreeNode* root) {
if (root == NULL) return root; //终止条件
swap(root->left, root->right); // 中
invertTree(root->left); // 递归左
invertTree(root->right); // 递归右
return root;
}
};
执行用时:4 ms, 在所有 C++ 提交中击败了53.21%的用户
内存消耗:9.5 MB, 在所有 C++ 提交中击败了25.95%的用户
通过测试用例:77 / 77
解题思路3
递归能做的,栈也能做。
利用栈进行迭代
代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
//迭代
TreeNode* invertTree(TreeNode* root) {
if (root == NULL) return root; //终止条件
stack<TreeNode*> st;
st.push(root);
while(!st.empty()){
//取到栈顶元素
TreeNode* node = st.top();
st.pop();
swap(node->left,node->right); //翻转左右子树
if(node->left) st.push(node->left); //左子树入栈
if(node->right) st.push(node->right); //右子树入栈
}
return root;
}
};
执行用时:0 ms, 在所有 C++ 提交中击败了100.00%的用户
内存消耗:9.6 MB, 在所有 C++ 提交中击败了6.22%的用户
通过测试用例:77 / 77