题目
请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。
解题思路
我们定义一种对称的遍历算法,即先遍历父节点,再遍历它的右子节点,最后遍历它的左子节点。
通过比较二叉树的前序遍历序列和对称前序遍历序列来判断二叉树是不是对称的。如果两个序列是一样的,那么二叉树就是对称的。
class Solution {
public:
bool isSymmetric(TreeNode* root) {
return isSymmetric(root,root);
}
//注:root=nullptr可以转化为!root
bool isSymmetric(TreeNode* root1,TreeNode* root2) {
if(!root1&&!root2)// root=nullptr为false(转化为boll类型),!root=true
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);
}
};
- 时间复杂度:O(n),其中 N 为二叉树的节点数量,每次执行 isSymmetric() 可以判断一对节点是否对称,因此最多调用 N/2 次 isSymmetric() 方法。leetcode上说明这里遍历了整棵树,遍历和调用isSymmetric的区别是?
- 空间复杂度 O(N) : 最差情况下(见下图),二叉树退化为链表,系统使用 O(N) 大小的栈空间
注:此方式会遍历两次,存在重复遍历,可修改为
class Solution {
public:
bool isSymmetric(TreeNode* root) {
return isSymmetric(root_>left,root->right);
}
//注:root=nullptr可以转化为!root
bool isSymmetric(TreeNode* root1,TreeNode* root2) {
if(!root1&&!root2)// root=nullptr为false(转化为boll类型),!root=true
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);
}
};