请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。
例如,二叉树 [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
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/dui-cheng-de-er-cha-shu-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
1主要思路:
没有做出来。
- 观察题目,应该如何判断其是对称的呢?
首先根节点的左右孩子应该都存在或者都不存在,存在时并相等;
此后左孩子的左孩子与右孩子的右孩子应该相等,并且左孩子的右孩子与右孩子的左孩子应该相等。
- 判断的停止条件是什么?
二叉树的所有情况,根节点root为空或者只有根节点、双亲只有一个孩子、双亲有两个孩子;
每次都应该判断根节点不能为空,对于双亲只有一个孩子的在递归中可以通过每次判别根节点不为空来判别,对于双亲有两个孩子的可以通过左右孩子不为空来使其不再去判别叶子节点。
2 主要代码:
class Solution {
public:
bool isSymmetric(TreeNode* root) {
if(!root){
return true;
}else{
return isSymmetric(root->left, root->right);
}
}
bool isSymmetric(TreeNode* left, TreeNode* right){
if(!left && ! right) return true;//不断递归判断,如果左右均为空,说明对称地访问 访问完了
if(!left || !right || left->val!=right->val)return false;//如果某个为空或者都不为空但是值不相等,此时说明不相等
return isSymmetric(left->left, right->right) && isSymmetric(left->right, right->left);
//接下来访问左子树的左孩子与右子树的右孩子、左子树的右孩子与右子树的左孩子。
}
};
代码分析:
1)在递归的代码块中,如果left与right同时为空,那么说明到达了叶子节点,下边就没有孩子了。如果不同时为空,那么分为某个为空或者均不为空的情况,如果某个为空,那么就直接不相等,如果两个均不为空,但是数值不相等,那么也算不相等,直接返回false;
2)在最后一句递归的代码中,我们根据最小的树来看就可以。由第一幅图可以看出,应该实现的代码。另外,存在第四层,那么仍然是将两个3节点对应的指针送入函数进行判别。
3)我们可以发现,在遍历过程中,只要出现一次返回的是false,由于递归中的&&短路规则,导致后序的节点都不再进入函数中判断。