一、二叉树翻转理论
想要翻转二叉树,要进行以下两个步骤:
- 遍历二叉树每一个节点
- 翻转每一个节点的左右孩子节点,没有左右孩子节点的可以视作其左右孩子节点为nullptr
二、二叉树翻转代码
- 翻转二叉树
1、前序遍历翻转二叉树
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;
}
};
2、后序遍历翻转二叉树
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
if (root == NULL) return root;
invertTree(root->left); // 左
invertTree(root->right); // 右
swap(root->left, root->right); // 中
return root;
}
};
3、中序遍历翻转二叉树
注意,先翻转了left,然后翻转了root,此时没有翻转的right变成了left,因此中序遍历需要特别注意在交换了root后,right是原来的left,left是原来的right。
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
if (root == NULL) return root;
invertTree(root->left); // 左
swap(root->left, root->right); // 中
invertTree(root->left); // 右 注意这里的left是原来的右
return root;
}
};
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
if (root == NULL) return root;
invertTree(root->right); // 左
swap(root->left, root->right); // 中
invertTree(root->right); // 右 注意这里的是right是原来的左
return root;
}
};
4、层次遍历翻转二叉树
将层次遍历时将二叉树节点值存入结果的操作
变成翻转左右孩子节点的操作
即可。
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
stack<TreeNode*> st;
if(root != nullptr){
st.push(root);
while(!st.empty()){
TreeNode* node = st.top();
if(node != nullptr){
st.pop();
if(node->right) st.push(node->right);
if(node->left) st.push(node->left);
st.push(node);
st.push(nullptr);
} else {
st.pop();
node = st.top();
st.pop();
//和层次翻转二叉树相比,只是改变了对排好的节点的处理办法
swap(node->left, node->right);
}
}
}
return root;
}
};