判断一个二叉树是不是镜像的
思路:
定义一种先遍历右子树再遍历左子树的遍历方法,与相应的对称遍历结果一致,则证明二叉树对称。
对于树的遍历,一般采用的方法为递归。
只需要分别考察:R1->left与R2->right比较,R2->left与R1->right比较即可。
注意:为了能够将两字小子树传入,需再定以一个两个参数的函数。
/*
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==nullptr)
return true;
return isSymmetrical(pRoot,pRoot);
}
bool isSymmetrical(TreeNode* pLeft,TreeNode* pRight)
{
if(pLeft==nullptr && pRight==nullptr)
return true;
if(pLeft==nullptr || pRight==nullptr)
return false;
if(pLeft->val!=pRight->val)
return false;
return isSymmetrical(pLeft->right,pRight->left) && isSymmetrical(pLeft->left,pRight->right);
}
};
求一个二叉树的镜像
思路:对于每一个子树自底向上调用mirror操作,然后对顶部的两个左右子树指针进行操作。
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
void Mirror(TreeNode *pRoot) {
if(pRoot==nullptr||(pRoot->left==nullptr &&pRoot->right==nullptr))
return;
if(pRoot->left!=nullptr)
Mirror(pRoot->left);
if(pRoot->right!=nullptr)
Mirror(pRoot->right);
TreeNode* temp=new TreeNode(0);//中间辅助节点
temp=pRoot->right;
pRoot->right=pRoot->left;
pRoot->left=temp;
}
};
网友评论