判断二叉树是否对称,是否相等,是否对称,都是一个套路 ## C++代码 ``` class Solution { public: bool compare(TreeNode* left, TreeNode* right) { if (left == NULL && right != NULL) return false; else if (left != NULL && right == NULL) return false; else if (left == NULL && right == NULL) return true; else if (left->val != right->val) return false; else return compare(left->left, right->left) && compare(left->right, right->right); } bool isSubtree(TreeNode* s, TreeNode* t) { if (s == NULL) return false; if (compare(s, t)) return true; if(isSubtree(s->left, t)) return true; if (isSubtree(s->right, t)) return true; return false; } }; ``` ``` class Solution { public: bool isSameTree(TreeNode* p, TreeNode* q) { if (p == NULL && q == NULL) return true; if (p == NULL || q == NULL) return false; queue que; que.push(p); // que.push(q); // while (!que.empty()) { // TreeNode* leftNode = que.front(); que.pop(); TreeNode* rightNode = que.front(); que.pop(); if (!leftNode && !rightNode) { // continue; } if ((!leftNode || !rightNode || (leftNode->val != rightNode->val))) { return false; } que.push(leftNode->left); // que.push(rightNode->left); // que.push(leftNode->right); // que.push(rightNode->right); // } return true; } bool isSubtree(TreeNode* s, TreeNode* t) { stack st; vector result; if (s == NULL) return false; st.push(s); while (!st.empty()) { TreeNode* node = st.top(); // 中 st.pop(); if(isSameTree(node, t)) return true; if (node->right) st.push(node->right); // 右(空节点不入栈) if (node->left) st.push(node->left); // 左(空节点不入栈) } return false; } }; ```