算法题目:Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).
For example, this binary tree is symmetric:
But the following is not:
Note:
Bonus points if you could solve it both recursively and iteratively.
大致意思:判断一颗二叉树是否关于中轴线对称,如例子所示。能不能用递归和循环两种方式实现
递归思路:比较简单,传入两个结点作为参数,比较这两个节点是否对称,若对称则比较节点1的左子树与节点2的右子树同时比较节点1的右子树和节点2的左子树。递归终止条件:假如节点1和节点2中至少有一个为空,则返回节点1==节点2?代码如下:
bool SymmetricCore(TreeNode* pleft,TreeNode* pright)
{
if(pleft==NULL||pright==NULL)
return pleft==pright;
if(pleft->val!=pright->val)return false;
return SymmetricCore(pleft->left,pright->right)&&SymmetricCore(pleft->right,pright->left);
}
bool isSymmetric(TreeNode* root) {
if(root==NULL)return true;
return SymmetricCore(root->left,root->right);
}
循环思路:用vector实现,实现性层序遍历。代码如下:
bool isSymmetric(TreeNode* root) {
if(root==NULL)return true;
vector<TreeNode*> mydq;
mydq.push_back(root);
int currentnum=1;
int nextnum=0;
while(!mydq.empty())
{
TreeNode* pNode=mydq[0];
if(pNode)
{
mydq.push_back(pNode->left);
nextnum++;
mydq.push_back(pNode->right);
nextnum++;
}
mydq.erase(mydq.begin());
currentnum--;
if(currentnum==0)
{
int i=0;
int j=mydq.size()-1;
while(j>i)
{
if((mydq[i]&&mydq[j]&&mydq[i]->val!=mydq[j]->val)||(mydq[i]==NULL&&mydq[j])||(mydq[i]&&mydq[j]==NULL))
{
return false;
}
i++;
j--;
}
currentnum=nextnum;
nextnum=0;
}
}
return true;
}