题目描述
请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。
解题思路:
使用队列保存所有的镜像节点,如果队列中只有一个节点,则比较左右节点是否相同,相同则放入队列;如果队列有多个节点,则拿出前两个,比较t1的左儿子与t2的右儿子是否相同,相同则放入队列,比较t1的右儿子与t2的左儿子是否相同,相同则放入队列。类似于广搜思想。
class Solution {
public:
bool isSymmetrical(TreeNode* pRoot)
{
if(pRoot == NULL) return true;
queue<TreeNode*> Myque;
Myque.push(pRoot);
TreeNode *tree1, *tree2;
while(!Myque.empty()){
tree1 = NULL;
tree2 = NULL;
if(Myque.size() == 1){
//只有一个节点时只需要比较左右儿子
tree1 = Myque.front();
Myque.pop();
if(tree1->left != NULL && tree1->right != NULL){
if(tree1->left->val == tree1->right->val){
Myque.push(tree1->left);
Myque.push(tree1->right);
}else{
return false;
}
}else if(tree1->left == NULL && tree1->right != NULL){
return false;
}else if(tree1->left != NULL && tree1->right == NULL){
return false;
}
}else{
tree1 = Myque.front();
Myque.pop();
tree2 = Myque.front();
Myque.pop();
//比较tree1的左儿子与tree2的右儿子值是否相同
if(tree1->left != NULL && tree2->right != NULL){
if(tree1->left->val == tree2->right->val){
Myque.push(tree1->left);
Myque.push(tree2->right);
}else{
return false;
}
}else if(tree1->left != NULL && tree2->right == NULL){
return false;
}else if(tree1->left == NULL && tree2->right != NULL){
return false;
}
//比较tree1的右儿子与tree2的左儿子值是否相同
if(tree1->right != NULL && tree2->left != NULL){
if(tree1->right->val == tree2->left->val){
Myque.push(tree1->right);
Myque.push(tree2->left);
}else{
return false;
}
}else if(tree1->right != NULL && tree2->left == NULL){
return false;
}else if(tree1->right == NULL && tree2->left != NULL){
return false;
}
}
}
return true;
}
};