题目:
请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。
分析:考察二叉树递归遍历,先序遍历(根左右)与重新定义的对称的遍历(根右左)的结果应该是一样的。
判断标准:对称位置的节点均为nullptr,则对称且遍历结束;对称位置的节点不完全为nullptr,则不对称;对称位置节点值不相等,则不对称;继续遍历该位置的左右子树的情况。
#include<iostream>
using namespace std;
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){
return is_Symmetrical(pRoot, pRoot);
}
private:
bool is_Symmetrical(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 is_Symmetrical(pRoot1->left, pRoot2->right) && is_Symmetrical(pRoot1->right, pRoot2->left);//继续判断该节点的左右子节点情况
}
};
该题目的核心递归遍历过程与T26 树的子结构类似(点击打开链接)