![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/25cd0cc675a06429263fd17f4339b63f.png)
交换每个节点的左右孩子即可
递归解法
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
if(root == nullptr){
return nullptr;
}
TreeNode* tmp = invertTree(root->left);
root->left = invertTree(root->right);
root->right = tmp;
return root;
}
};
此时代码中调用两次invertTree返回的都是NULL,就是用三行代码交换了三次NULL,最后返回1这个节点
root为2时,1和3分别返回该节点的地址,即tmp记录了节点1的地址,用root->left接受了节点3的地址,然后用tmp给root->right赋值,这样就完成了交换
同上,2和7的子节点完成了交换,给父节点4返回自己的地址,用同样的方法完成了交换
DFS迭代法
递归法是下方节点先交换,上方节点后交换
迭代法则是按照先序遍历的方式,从上到下进行交换,下方交换完了,再到两一侧的子树进行交换
TreeNode* invertTree(TreeNode* root) {
if(root == nullptr){
return nullptr;
}
stack<TreeNode*> st;
st.push(root);
while(!st.empty()){
TreeNode* top = st.top();
st.pop();
swap(top->left, top->right);
if(nullptr != top->left) {
st.push(top->left);
}
if(nullptr != top->right) {
st.push(top->right);
}
}
return root;
}
BFS迭代法
TreeNode* invertTree(TreeNode* root) {
if(root == nullptr){
return nullptr;
}
queue<TreeNode*> q;
q.push(root);
while(!q.empty()){
TreeNode* front = q.front();
q.pop();
swap(front->left, front->right);
if(nullptr != front->left) {
q.push(front->left);
}
if(nullptr != front->right) {
q.push(front->right);
}
}
return root;
}
只要每个节点都遍历到,交换两个孩子节点即可