开刷二叉树,都先从递归解。
提交了好几次
先看第一遍正确解法。
class Solution {
public:
void reverselr(TreeNode* &lnode,TreeNode* &rnode)
{
if(lnode==nullptr&&rnode==nullptr)
return;
if(lnode==nullptr)
{
lnode=rnode;
rnode=nullptr;
//之前之前return,报错,没有考虑到lnode需要继续递归
return reverselr(lnode->left,lnode->right);
}
if(rnode==nullptr)
{
rnode=lnode;
lnode=nullptr;
return reverselr(rnode->left,rnode->right);
}
TreeNode *temp;
temp=lnode;
lnode=rnode;
rnode=temp;
reverselr(lnode->left,rnode->right);
reverselr(lnode->right,rnode->left);
}
TreeNode* invertTree(TreeNode* root) {
if(root!=nullptr)
reverselr(root->left,root->right);
return root;
}
};
这里我是分情况去做,如果左右结点都有值,那就交换值,如果一方有值,一方没有就交换结点。
实际上可以合并为只交换结点的情况
class Solution {
public:
void reverselr(TreeNode* &lnode,TreeNode* &rnode)
{
if(lnode==nullptr&&rnode==nullptr)
return;
TreeNode *temp;
temp=lnode;
lnode=rnode;
rnode=temp;
//这里都交换结点的时候,就不能像上面那样了,因为是引用传参,同时还要注意lnode和rnode不能为空
if(lnode!=nullptr)
reverselr(lnode->left,lnode->right);
if(rnode!=nullptr)
reverselr(rnode->left,rnode->right);
}
TreeNode* invertTree(TreeNode* root) {
if(root!=nullptr)
reverselr(root->left,root->right);
return root;
}
};
但学习了答案之后发现还可以再简化
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
if(root==nullptr)
return root;
TreeNode *lnode=invertTree(root->left);
TreeNode *rnode=invertTree(root->right);
root->left=rnode;
root->right=lnode;
//我第一遍写出来的是下面的情况,利用了一个中间变量,但看官方解法才是精炼啊!!
// TreeNode *temp=root->left;
// root->left=root->right;
// root->right=temp;
// invertTree(root->left);
// invertTree(root->right);
//再学习之后发现,用中间变量也可以继续简化
//TreeNode *temp=root->left;
//root->left=invertTree(root->right);
//root->right=invertTree(temp);
return root;
}
};