剑指offer58_对称的二叉树_题解
对称的二叉树
题目描述
请实现一个函数,用来判断一棵二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。
分析
方案一:递归
对称二叉树定义:对于树中任意两个对称结点 \(L\) 和 \(R\),一定有:
- \(L.val=R.val:\) 即两对称结点值相等
- \(L.left.val=R.right.val:\) 即 \(L\) 的左子节点和 \(R\) 的右子节点对称
- \(L.left.val=R.right.val:\) 即 \(L\) 的左子节点和 \(R\) 的右子节点对称
设置一个递归函数 \(IsSymmetrical(L, R)\),对称返回 \(true\) ,否则返回 \(false\)
递归终止条件:
如果 \(L\) 和 \(R\) 都为空指针,返回 \(true\);否则如果只有一个为空指针,返回 \(false\)
递归:
判断两结点 \(L->left\) 和 \(R->right\) 是否对称,即 \(IsSymmetrical(L->left, R->right)\)
判断两结点 \(L->right\) 和 \(R->left\) 是否对称,即 \(IsSymmetrical(L->right, R->left)\)
代码
/*
1.时间复杂度:O(n)
2.空间复杂度:O(n)
最坏情况下,二叉树退化为链表
*/
class Solution
{
public:
bool isSymmetrical(TreeNode *pRoot1, TreeNode *pRoot2)
{
if (pRoot1 == NULL && pRoot2 == NULL)
return true;
if (pRoot1 == NULL || pRoot2 == NULL)
return false;
if (pRoot1->val != pRoot2->val)
return false;
return isSymmetrical(pRoot1->left, pRoot2->right) && isSymmetrical(pRoot1->right, pRoot2->left);
}
bool isSymmetrical(TreeNode *pRoot)
{
return isSymmetrical(pRoot, pRoot);
}
};