题目描述
请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。
思路:递归做法,设p,q分别为左右子树,p,q的值相等,对称条件即为:p的左子树和q的右子树对称,p的右子树和q的左子树对称。
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
*/
class Solution {
public:
bool isSymmetrical(TreeNode* pRoot)
{
if(!pRoot) return true;
return symmetric(pRoot->left,pRoot->right);
}
private:
bool symmetric(TreeNode* p,TreeNode* q)
{
if(!p&&!q) return true;
if(!p||!q) return false;
return (p->val==q->val) &&symmetric(p->left,q->right)&&symmetric(p->right,q->left);
}
};
思路2:使用一个栈,入栈顺序为p->left,q-right,p->right,q->left
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
*/
class Solution {
public:
bool isSymmetrical(TreeNode* root)
{
if(!root) return true; //空树是对称的
stack<TreeNode *> s;
TreeNode *p=root->left,*q=root->right;
s.push(p);
s.push(q); //即使是空节点,也是可以push到栈里的,栈并不为空。
while(!s.empty())
{
p=s.top();s.pop();
q=s.top();s.pop();
if(!p && !q) continue; //p、q都是空节点
if(!p || !q) return false; //有一个为空,不对称
if(p->val!=q->val) return false; //值不相等,不对称
s.push(p->left);s.push(q->right);
s.push(p->right);s.push(q->left);
}
return true;
}
};
.