请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。
例如,二叉树 [1,2,2,3,4,4,3] 是对称的。

思路:使用递归,我们可以通过比较原二叉树和对阵前序遍历(需要将null节点也考虑进来)来判断其是不是对称的。
评论区有位老哥说的好:
做递归思考三步:
递归的函数要干什么?
函数的作用是判断传入的两个树是否镜像。
输入:TreeNode left, TreeNode right
输出:是:true,不是:false
递归停止的条件是什么?
左节点和右节点都为空 -> 倒底了都长得一样 ->true
左节点为空的时候右节点不为空,或反之 -> 长得不一样-> false
左右节点值不相等 -> 长得不一样 -> false
从某层到下一层的关系是什么?
要想两棵树镜像,那么一棵树左边的左边要和二棵树右边的右边镜像,一棵树左边的右边要和二棵树右边的左边镜像
调用递归函数传入左左和右右
调用递归函数传入左右和右左
只有左左和右右镜像且左右和右左镜像的时候,我们才能说这两棵树是镜像的
调用递归函数,我们想知道它的左右孩子是否镜像,传入的值是root的左孩子和右孩子。这之前记得判个root==null。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
bool isSymmetric(TreeNode* root) {
return isSymmetric(root,root);
}
bool isSymmetric(TreeNode* root1,TreeNode* root2)
{
if(!root1&&!root2)//如果两个节点同时到达叶节点
return true;
if(!root1||!root2)//两个节点没有同时到达叶节点
return false;
if(root1->val!=root2->val)//非叶子节点的值不相同
return false;
return isSymmetric(root1->left,root2->right)&&isSymmetric(root1->right,root2->left);
}
};
】剑指 Offer 28. 对称的二叉树&spm=1001.2101.3001.5002&articleId=108740382&d=1&t=3&u=79df61c145554a768e3e6d22db41f487)
212

被折叠的 条评论
为什么被折叠?



