bool isSymmetric(TreeNode* root) {
if (!root) return true;
return isSymmetric(root->left, root->right);
}
bool isSymmetric(TreeNode *left, TreeNode *right) {
if (!left && !right) return true;
if (!left || !right) return false;
return left->val == right->val
&& isSymmetric(left->left, right->right)
&& isSymmetric(left->right, right->left);
}
bool isSubtree(TreeNode* s, TreeNode* t) {
if (!t) return true;
if (!s) return false;
if (s->val == t->val && isSame(s, t)) return true;
return isSubtree(s->left, t) || isSubtree(s->right, t);
}
bool isSame(TreeNode* s, TreeNode* t) {
if (!s && !t) return true;
if (!s || !t) return false;
if (s->val != t->val) return false;
return isSame(s->left, t->left) && isSame(s->right, t->right);
}