101. 对称二叉树
前置题目100. 相同的树 - 力扣(LeetCode)
与100题不同,对称二叉树要求镜像对称,因此需要比较左子树的左子树与右子树的右子树是否相等,以及左子树的右子树与右子树的左子树是否相等。虽然比较的对象不同,但本质上都是在判断节点的值是否相同。
本题适合采用递归方法解决,因为可以将问题分解为相同的子问题,且子问题与原问题的处理逻辑完全一致。例如,
对于这棵二叉树,由于根节点本身已经对称,问题就转化为判断其左右子树是否相同,即节点 2 和节点 2 的对称性。接下来,我们需要对这两个节点的子树进行相同的对称性判断。
在递归过程中,终止条件为:当左右子树中任意一个节点为空时,需要判断另一个节点是否也为空。如果其中一个为空而另一个不为空,则两子树必然不对称。在此基础上,我们继续递归地比较节点的值以及它们的左右子树。
代码:
class Solution {
public:bool isSameTree(TreeNode* p, TreeNode* q) {if(p == nullptr || q == nullptr) {return p == q;}return p->val == q->val && isSameTree(p->left,q->right) && isSameTree(p->right,q->left);}bool isSymmetric(TreeNode* root) {return isSameTree(root->left,root->right);}
};
时间复杂度:O(n),n为树的节点数量,所有节点最多遍历一次
空间复杂度:O(n),最坏的情况下,树是一条链,需要O(n)的递归栈空间