【剑指Offer-画图让抽象问题形象化】面试题28:对称的二叉树
题目描述
请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。
思路
前序遍历的顺序是根结点、左子节点、右子结点。把顺序为根结点、右子结点、左子节点的遍历称为“反前序遍历”。如果一棵树的前序遍历序列和反前序遍历序列相同,那么这棵树就是对称的。代码如下:
/*
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 check(pRoot, pRoot);
}
bool check(TreeNode* pRoot1, TreeNode* pRoot2)
{
if(pRoot1==nullptr && pRoot2==nullptr)
return true;
if(pRoot1==nullptr || pRoot2==nullptr)
return false;
if(pRoot1->val!=pRoot2->val)
return false;
return check(pRoot1->left, pRoot2->right) && check(pRoot1->right, pRoot2->left);
}
};
这是书上的代码,但是感觉并没有用到前序遍历序列和反前序遍历序列是否相同来判断,而是根据树的对称线来对比相应位置的左右节点是否相同,代码写的很好很简洁,值得细细琢磨。