前言
本题让我对二叉树的解题思路更进一步理解,虽然是道简单题,但第一次做这种同时递归两个二叉树的题还是会有点茫然。看到此题,我脑中第一个思路是将左右子树遍历,然后将遍历的值存在容器里,但是提交的时候,出现了一个例子[1,2,2,2,null,2],输出的是true,但答案是false,我认为是这个例子本身不规范造成的,我在vscode里自己设定的例子[1,2,2,2,null,null,2]最后可以通过,但我不知道怎么进行判断,加上这个思路不高效,因此选择了参考其它的思路。
题目
给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [1,2,2,3,4,4,3] 是对称的。
但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:
思路
同时遍历左右子树,每遍历一次节点就对比一下
递归法
1.确定递归函数的参数和返回类型
- 参数:需要给定的二叉树的左右子树
- 返回类型:该题也是验证,递归函数需要返回值,可以用bool类型来表示
2.确定终止条件
- 两个节点都为null时,返回true
- 一个节点为null,一个节点不为null时,返回false
- 两个节点的值不等时,就返回false
if(lroot == NULL && rroot == NULL)
return true;
if(!lroot||!rroot)
return false;
if(lroot->val != rroot->val)
return false;
3.确定单层递归的逻辑
- 先按左子树的左节点与右子树的右节点进行遍历
- 再按着左子树的右节点与右子树的左节点进行遍历
doublelr(lroot->left,rroot->right)&&doublelr(lroot->right,rroot->left)
代码实现
/**
* 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:
bool isSymmetric(TreeNode* root) {
return doublelr(root->left,root->right);
}
bool doublelr(TreeNode* lroot,TreeNode* rroot){
if(lroot == NULL && rroot == NULL)
return true;
if(!lroot||!rroot)
return false;
if(lroot->val != rroot->val){
return false;
}
else
return doublelr(lroot->left,rroot->right)&&doublelr(lroot->right,rroot->left);
}
};