树=递归||队列||栈
这道题就是用递归,递归入口是判断左右子树。
递归边界:有3个,p1和p2均为空就是true,一个为空一个不为空就是false。
递归式:如果这两个结点的值相等,才进行接下去的判断,否则返回false。递归式是判断p1的左子树和p2的右子树以及p1的右子树和左子树。均为真才是真。
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
*/
class Solution {
public:
bool isSame(TreeNode* p1, TreeNode* p2){
//三个递归边界,递归式是判断p1的左和p2的右是否相等以及p1的右以及p2的左是否相等
if(p1 == NULL && p2 != NULL) return false;
if(p1 != NULL && p2 == NULL) return false;
if(p1 == NULL && p2 == NULL) return true;
if(p1->val == p2->val) return isSame(p1->left, p2->right) && isSame(p1->right, p2->left);
else return false;
}
bool isSymmetrical(TreeNode* pRoot)
{
//判断是否对称,bfs判断每一层结点的vector是否和反转后的reverse是否相等
if(pRoot == NULL) return true;
//递归判断,先判断结点的左右子结点
return isSame(pRoot->left,pRoot->right);
//bfs每层判断也可以,来两个queue,分别存放根结点的左右结点
//一边放入左右,另一边放入右左
}
};