再生产中 2022-11-24 17:36 采纳率: 77.8%
浏览 9
已结题

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

  • 写回答

2条回答 默认 最新

  • 川入 2022-11-24 21:58
    关注

    首先,理解是:题主是想将以数据的个数先对比,其次数据存入数组之后的数据一一对比,但是有两个问题:
    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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 12月3日
  • 已采纳回答 11月25日
  • 修改了问题 11月25日
  • 修改了问题 11月24日
  • 展开全部

悬赏问题

  • ¥15 echarts动画效果失效的问题。官网下载的例子。
  • ¥60 许可证msc licensing软件报错显示已有相同版本软件,但是下一步显示无法读取日志目录。
  • ¥15 Attention is all you need 的代码运行
  • ¥15 一个服务器已经有一个系统了如果用usb再装一个系统,原来的系统会被覆盖掉吗
  • ¥15 使用esm_msa1_t12_100M_UR50S蛋白质语言模型进行零样本预测时,终端显示出了sequence handled的进度条,但是并不出结果就自动终止回到命令提示行了是怎么回事:
  • ¥15 前置放大电路与功率放大电路相连放大倍数出现问题
  • ¥30 关于<main>标签页面跳转的问题
  • ¥80 部署运行web自动化项目
  • ¥15 腾讯云如何建立同一个项目中物模型之间的联系
  • ¥30 VMware 云桌面水印如何添加