C语言–判断是否为对称二叉树

请问自己写的代码错在哪里

题目:

img

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:对于空指针没有规范化

img

代码改正:

/**
 * 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;
    }
};

img