题解
这题意思明了,遍历左右节点,观察他们是否镜像对称即可
递归新的形式
在之前,我们遍历二叉树都是void 返回值
但是这题开始 题目要求我们返回true false
所以不能再是void 我们需要根据递归过程 检验是否符合题意
所以开头我们的 递归定义不同了
定义函数头
bool travelNode(TreeNode* left,TreeNode* right);
定义递归结束
首先不变的是 在递归函数开始 我们依旧要开始写 递归直接结束的情况
if(left!=nullptr&&right==nullptr)return false;
else if(left==nullptr&&right!=nullptr)return false;
else if(left==nullptr&&right==nullptr)return true;
else if(left->val!=right->val)return false;
递归逻辑
在满足开头后 我们就要开始写函数的主题
遍历二叉树结点 那么我们就要递归
travelnode(left->left,right->right);
travelnode(left->right,right->left);
但是我们要想 在最后的递归结束 我们需要返回bool 问题是这个bool如何传递呢
在递归过程中 如果检查到false 那么就需要一遍一遍的传递上来
将bool传递给第一个递归后结束递归 然后返回主程序
问题就是这个
bool left = travelnode(left->left,right->right);
bool right = travelnode(left->right,right->left);
我们可以简单的想 在递归题目 千万不要去人脑模拟递归 人脑肯定会stack overflow的 哪怕只有3次递归
我们想 在我们的第一个递归执行完毕 left right 都接受到了 返回主函数
如果left 或者right 有一个是false 那么说明 递归的过程中 又不符合题目的
所以 我们还需要return 一下
就是
return left&&right
bool travelnode(TreeNode* left ,TreeNode* right){
if(left!=nullptr&&right==nullptr)return false;
else if(left==nullptr&&right!=nullptr)return false;
else if(left==nullptr&&right==nullptr)return true;
else if(left->val!=right->val)return false;
bool l = travelnode(left->left,right->right);
bool r = travelnode(left->right,right->left);
return l&&r;
}
这个递归是前序遍历 检验当前的节点 是否符合 然后递归到下一层继续检验最后返回
最后的return 可以理解为递归的传递