我觉得思路没有问题:视为两颗子树,用中序遍历,一个方法是“左中右” 一个是“右中左” 结果一样就是对称的,反之则不是。但是跪了,null不等于空节点。(我头铁 我就要记录下来)
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
//将根节点的左右节点视为两棵树。两子树中的左右节点值相反
class Solution {
public:
void inorderLeft(TreeNode* root, vector<int> &ret) {
//左中右的中序遍历
if(root==nullptr){
return ;
}
inorderLeft(root->left,ret);
ret.push_back(root->val);
inorderLeft(root->right,ret);
}
void inorderRight(TreeNode* root, vector<int> &ret) {
//右中左的中序遍历
if(root==nullptr){
return ;
}
inorderRight(root->right,ret);
ret.push_back(root->val);
inorderRight(root->left,ret);
}
bool ifeq(vector<int>& a, vector<int>& b) {
//判断两vector是否相等
bool eq = false;
if (a.size() == b.size()) {
int i;
auto ap = a.begin();
auto bp = b.begin();
for (i = 0; i < a.size(); ++i) {
if ((*ap) != (*bp)) return eq;
++ap; ++bp;
}
return eq = true;
}
else return eq;
}
bool isSymmetric(TreeNode* root) {
vector<int> retL;
inorderLeft(root->left,retL);
vector<int> retR;
inorderRight(root->right,retR);
return ifeq(retL,retR);
}
};
正解 :参考评论了,递归判断两棵子树A&B,对应的A左节点和B右节点是否相等
class Solution {
public:
bool check(TreeNode* rootL, TreeNode *rootR ) {
if(rootL==nullptr&&rootR==nullptr){//如果对称位置的两节点都为空则返回true
return true;
}
if(rootL==nullptr||rootR==nullptr){//如果其中一个为空则返回false
return false;
}
if(rootL->val!=rootR->val){//如果不为空,但两节点值不相等则返回false
return false;
}
return check(rootL->left,rootR->right)&&check(rootL->right,rootR->left);
}
bool isSymmetric(TreeNode* root) {
return check(root->left,root->right);
}
};