题目链接:click~
:解法1:队列
/*题意:判断一颗二叉树是否是自己的镜像*/
/**
*思路: 只要保证根结点下的左子树的每一层是右子树的镜像,此树是自己的镜像
* 我们利用两个队列分别记录左右子树的每一层的结点。BFS遍历左右子树时
* 为方便比较左右结点,将空结点也加入到队列中。对于结点的判断,有以下情
* 况:
* 1)两边结点都为空,忽略
* 2)其中一边的结点为空,返回false
* 3)两边均不为空,但值不同,返回false
* 4)将左边结点的子结点按从左到右的顺序加入左边的队尾,将右边的子结点
* 按从右到左的顺序加入到右边的队尾。
* 最后判断两个队列是否都为空
*/
class Solution {
public:
bool isSymmetric(TreeNode *root) {
if(root == NULL) return true;
queue<TreeNode *> left, right;
left.push(root->left); //记录左子树中每一层的结点
right.push(root->right);//记录右子树中每一层的结点
while(!left.empty() && !right.empty()) {
TreeNode *l = left.front();
left.pop();
TreeNode *r = right.front();
right.pop();
if(l == NULL && r == NULL) continue; //情况1
if(l == NULL || r == NULL) return false; //情况2
if(l->val != r->val) return false; //情况3
left.push(l->left); left.push(l->right);//情况4
right.push(r->right); right.push(r->left);
}
if(left.empty() && right.empty()) return true;
else return false;
}
};
解法2:DFS
class Solution {
public:
bool DFS(TreeNode *l, TreeNode *r) {
if(l == NULL && r == NULL) return true;
if(l == NULL || r == NULL) return false;
if(l->val != r->val) return false;
return DFS(l->left, r->right) && DFS(l->right, r->left);
}
bool isSymmetric(TreeNode *root) {
if(root == NULL) return true;
return DFS(root->left, root->right);
}
};