请问自己写的代码错在哪里
题目:
C语言
我的代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
int calculation(struct TreeNode* t, int* a,int i)
{
if(t==NULL)
return i;
a[i++]=t->val;
calculation(t->left,a,i);
return calculation(t->right,a,i);
}
int calcu(struct TreeNode* t, int* a,int i)
{
if(t==NULL)
return i;
a[i++]=t->val;
calcu(t->right,a,i);
return calcu(t->left,a,i);
}
bool isSymmetric(struct TreeNode* root){
if(!root->left&&!root->right)
return true;
if(!root->left||!root->right)
return false;
int a1[1000]={0}, a2[1000]={0};
int count1=0, count2=0;
count1=calculation(root->left,a1,0);
count2=calcu(root->right,a2,0);
if(count1!=count2)
return false;
for(int i=0; i<count1; i++)
{
if(a1[i]!=a2[i])
return false;
}
return true;
}
首先,理解是:题主是想将以数据的个数先对比,其次数据存入数组之后的数据一一对比,但是有两个问题:
1:存左子树或右子树数据函数的数组,运用的下标i是临时变量,所以递归之后值会返回去,没有根据数据存储区间++下去(每次递归回去会原来的值)
2:对于空指针没有规范化
代码改正:
/**
* 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:
int calculation(struct TreeNode* t, int* a, int& i)//将i改为引用,使得每一层递归都一个保存
{
//将NULL时规范化,防止图示情况
if (t == NULL)
{
a[i++] = 0;
return i;
}
a[i++] = t->val;
calculation(t->left, a, i);
return calculation(t->right, a, i);
}
int calcu(struct TreeNode* t, int* a, int& i)//将i改为引用,使得每一层递归都一个保存
{
//将NULL时规范化,防止图示情况
if (t == NULL)
{
a[i++] = 0;
return i;
}
a[i++] = t->val;
calcu(t->right, a, i);
return calcu(t->left, a, i);
}
bool isSymmetric(struct TreeNode* root) {
if (!root->left && !root->right)
return true;
if (!root->left || !root->right)
return false;
int a1[1000] = { 0 }, a2[1000] = { 0 };
int count1 = 0, count2 = 0;
//引用必须要变量,所以定义两个
int i1 = 0, i2 = 0;
count1 = calculation(root->left, a1, i1);
count2 = calcu(root->right, a2, i2);
if (count1 != count2)
return false;
for (int i = 0; i < count1; i++)
{
if (a1[i] != a2[i])
return false;
}
return true;
}
};