题目:
请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。
例如,二叉树 [1,2,2,3,4,4,3] 是对称的。
1
/ \
2 2
/ \ / \
3 4 4 3
但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:1
/ \
2 2
\ \
3 3
示例 1:
输入:root = [1,2,2,3,4,4,3]
输出:true
示例 2:输入:root = [1,2,2,null,3,null,3]
输出:false
限制:
0 <= 节点个数 <= 1000
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/dui-cheng-de-er-cha-shu-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:
利用递归实现过程,详细结题思路都在源码中
源码:
/**
* 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) {
//判断特例
if(root == nullptr) return true;
return isMirror(root->left,root->right);
}
//1、递归的目的是:判断输入的两个树是否为镜像,若为镜像:True ;否则为False
bool isMirror(TreeNode * left, TreeNode * right){
/*
2、递归的关键是什么时候递归终止:
按照题目要求分析:
left == NULL && right == NULL ==>True
left == Null && right != NULL ==> False
left != Null && right == NULL ==> False
left->val != right->val ==> False
*/
if (left == nullptr && right == nullptr) return true;
if (left == nullptr ||right == nullptr) return false;
if (left->val != right->val) return false;
/*
3、上下层对应关系==>换句话:递归进行的前后关系传递:
两棵树镜像,那么:
一棵树左边的左边要和二棵树右边的右边镜像,
一棵树左边的右边要和二棵树右边的左边镜像
体现在递归调用上:
调用递归函数传入左左和右右
调用递归函数传入左右和右左
只有左左和右右镜像且左右和右左镜像的时候
调用递归函数,我们想知道它的左右孩子是否镜像,传入的值是root的左孩子和右孩子。
*/
return isMirror(left->left,right->right) && isMirror(left->right,right->left);
//当你缕清思路时候,最好不要进入内部栈调用过程,除非你大脑子,能模拟出栈调用
}
};
作者:happygallery
链接:https://leetcode-cn.com/problems/dui-cheng-de-er-cha-shu-lcof/solution/jian-zhi-offer-28-dui-cheng-de-er-cha-sh-0360/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。