题目描述
请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。
解题
递归做法
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
*/
class Solution {
public:
bool func(TreeNode* pRoot1, TreeNode* pRoot2){
if(pRoot1==NULL && pRoot2==NULL) return true;
if(pRoot1==NULL || pRoot2==NULL) return false;
if(pRoot1->val != pRoot2->val)return false;
return func(pRoot1->left, pRoot2->right) && func(pRoot1->right, pRoot2->left);
}
bool isSymmetrical(TreeNode* pRoot)
{
if(pRoot==NULL) return true;
return func(pRoot,pRoot);
}
};
DFS实现
/*
* DFS使用stack来保存成对的节点
* 1.出栈的时候也是成对成对的 ,
1.若都为空,继续;
2.一个为空,返回false;
3.不为空,比较当前值,值不等,返回false;
* 2.确定入栈顺序,每次入栈都是成对成对的,如left.left, right.right ;left.rigth,right.left
*/
class Solution {
public:
bool isSymmetrical(TreeNode* pRoot)
{
if(pRoot == NULL) return true;
stack<TreeNode*> s;
s.push(pRoot->left);
s.push(pRoot->right);
while(!s.empty()) {
TreeNode* right = s.top();//成对取出
s.pop();
TreeNode* left = s.top();
s.pop();
if(left == NULL && right == NULL) continue;
if(left == NULL || right == NULL) return false;
if(left->val != right->val) return false;
//成对插入
s.push(left->left);
s.push(right->right);
s.push(left->right);
s.push(right->left);
}
return true;
}
};
BFS实现
/*
* BFS使用Queue来保存成对的节点,代码和上面极其相似
* 1.出队的时候也是成对成对的
1.若都为空,继续;
2.一个为空,返回false;
3.不为空,比较当前值,值不等,返回false;
* 2.确定入队顺序,每次入队都是成对成对的,如left.left, right.right ;left.rigth,right.left
*/
class Solution {
public:
bool isSymmetrical(TreeNode* pRoot)
{
if(pRoot == NULL) return true;
queue<TreeNode*> s;
s.push(pRoot->left);
s.push(pRoot->right);
while(!s.empty()) {
TreeNode* right = s.front();//成对取出
s.pop();
TreeNode* left = s.front();
s.pop();
if(left == NULL && right == NULL) continue;
if(left == NULL || right == NULL) return false;
if(left->val != right->val) return false;
//成对插入
s.push(left->left);
s.push(right->right);
s.push(left->right);
s.push(right->left);
}
return true;
}
};
参考: