两道题有相似之处,所以放在一起分析归纳
两者都用到了递归的思想
对称二叉树:
bool check(TreeNode*a,TreeNode*b)
{
if(!a&&!b) return true;
if(!a||!b) return false;
return a->val==b->val&&check(a->left,b->right)&&check(a->right,b->left);
}
bool isSymmetric(TreeNode* root) {
return check(root,root);
}
其思想主要是传入两个节点,初始传入的第一个和第二个节点都是根节点方便后续操作。
由于对称的思想是,左子树的左子树等于右子树的右子树,左子树的右子树等于右子树的左子树。
考虑递归返回条件,当都为空的时候返回true;当只有一方为空返回false;最后递归其左子树和右子树,递归左子树的右子树和右子树的左子树即可。&&链接保证了只要有一个false边返回false;
现在看起来,开始传入两个root是为了让后续条件统一;
相等二叉树的判断:
其实也是一样,上面的思想是左子树等于右子树,下面就是左子树等于左子树,右子树等于右子树,仔细体会开始传入两个root的用法