最后小新 2023-05-04 14:54 采纳率: 80%
浏览 161
已结题

帮我看看哪里有问题(计算二叉树左子叶权重)

可不可以帮我看看哪里不对。
计算二叉树左子叶权重和

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#define NULL -1

typedef struct TreeNode {
    int id;
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
} TreeNode, *TreeNodePtr;

typedef struct ListNode {
    struct TreeNode *node; // 队列的值的类型是树节点指针
    struct ListNode *next;
} ListNode, *ListNodePtr;

typedef struct Queue {
    ListNodePtr dummyHead;
    ListNodePtr tail;
    int size;
} *QueuePtr;

// 创建链表的节点
ListNodePtr createListNode(TreeNodePtr node, ListNodePtr next) {
    ListNodePtr curr = (ListNodePtr) (malloc(sizeof(ListNode)));
    curr->node = node;
    curr->next = next;
    return curr;
}

// 创建树的节点
int TreeId = 0;

TreeNodePtr createTreeNode(int val, TreeNodePtr left, TreeNodePtr right) {
    TreeNodePtr curr = (TreeNodePtr) (malloc(sizeof(TreeNode)));
    curr->id = TreeId++;
    curr->val = val;
    curr->left = left;
    curr->right = right;
    return curr;
}

// 单链表队列初始化
QueuePtr InitQueue() {
    QueuePtr queue = (QueuePtr) malloc(sizeof(struct Queue));
    TreeNodePtr dummyTreeNode = createTreeNode(-1, NULL, NULL);
    queue->size = 0;
    queue->dummyHead = createListNode(dummyTreeNode, NULL);
    queue->tail = queue->dummyHead;
    return queue;
}

// 在 queue 的尾部添加一个元素的副本
void EnQueue(QueuePtr queue, TreeNodePtr node) {
    ListNodePtr curr = createListNode(node, NULL);
    queue->tail->next = curr;
    queue->tail = queue->tail->next;
    queue->size++;
}

// 删除 queue 中的第一个元素
void DeQueue(QueuePtr queue) {
    if (queue->size == 0) {
        perror("error! the size of queue is zero when call DeQueue().");
        return;
    }
    ListNodePtr head = queue->dummyHead->next;
    queue->dummyHead->next = head->next;
    queue->size--;
    if (queue->size == 0) queue->tail = queue->dummyHead;
    free(head);
}

// 如果 queue 中没有元素, 返回 true
bool QueueEmpty(QueuePtr queue) {
    return queue->size == 0;
}

// 返回 queue 中第一个元素的引用
TreeNodePtr GetHead(QueuePtr queue) {
    if (QueueEmpty(queue)) {
        perror("error! the size of queue is zero when call front().");
        return NULL;
    } else {
        return queue->dummyHead->next->node;
    }
}

int max(int a, int b) {
    return (a >= b) ? a : b;
}

// 将输入转换为数组
void getDigits(char *buff, int *data) {
    int len = strlen(buff);
    int index = 0;
    for (int i = 0; i < len; i++) {
        int num = 0;
        if (buff[i] == '#') {
            num = -1;
            i++;
        } else {
            while (buff[i] != ' ' && buff[i] != '\0') {
                num = num * 10 + (buff[i++] - '0');
            }
        }
        data[index++] = num;
    }
}

// 删除二叉树
void destoryTree(TreeNodePtr root) {
    if (!root) return;
    if (root->left) {
        destoryTree(root->left);
        root->left = NULL;
    }
    if (root->right) {
        destoryTree(root->right);
        root->right = NULL;
    }
    free(root);
}

TreeNodePtr createTreeWithLevelOrder(int *data, int size) {
    QueuePtr queue=InitQueue();
    TreeNodePtr root=createTreeNode(data[0],NULL,NULL);
    EnQueue(queue,root);
    EnQueue(queue,root);
    for(int i=1;i<size;i++)
    {
        TreeNodePtr father=GetHead(queue);
        DeQueue(queue);
        TreeNodePtr now=createTreeNode(data[i],NULL,NULL);
        if(father->left==NULL) father->left=now;
        else father->right=now;
        EnQueue(queue,now);
        EnQueue(queue,now);
    }
    return root;
}
int sumOfLeftLeaves(TreeNodePtr root) {
    if(root==NULL || root->val==-1)
    return 0;
    int sum = 0;
    if (root->left != NULL  && root->left->left == NULL  && root->left->right == NULL) {
        // 左子结点是叶子结点,将其权重加入结果中
        sum += root->left->val;
    } else {
        // 递归处理左子树和右子树
        sum += sumOfLeftLeaves(root->left);
        sum += sumOfLeftLeaves(root->right);
    }
    return sum;
}


int main() {
    int SIZE = 128;
    int MAX_NUM = 10;
    char buff[SIZE];
    int num;
    bool use_graphviz = false;

    int i = 0;
    while (scanf("%d\n", &num) == 1) {
        fgets(buff, SIZE, stdin);
        char *pos = strchr(buff, '\n');          //查找换行符
        if (pos)                            //如果find不为空指针
            *pos = '\0';                    //就把一个空字符放在这里


        int size = num;
        int data[size];
        getDigits(buff, data);
        TreeNodePtr tree_root = createTreeWithLevelOrder(data, size);

        int weight_sum = sumOfLeftLeaves(tree_root);
        printf("%d",weight_sum);


        i++;
    }
    return 0;
    }

img

  • 写回答

7条回答 默认 最新

  • Leodong. 2023-05-04 15:00
    关注

    该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下。
    根据你提供的代码和问题描述,发现代码中存在以下问题:

    1. 宏定义 NULL 与标准库中定义的 NULL 冲突,会导致编译错误。建议使用其他名字或者直接使用标准库中的 NULL。

    2. 在函数 sumOfLeftLeaves 中,判断左子节点是否为叶子节点的条件不正确。应该判断左子节点不为 NULL,且左子节点的左右子节点均为 NULL。

    3. 在主函数中,没有释放动态分配的内存。应该在使用完二叉树后调用 destoryTree 函数释放内存。

    下面是修改后的代码:

    #include <stdio.h>
    #include <stdlib.h>
    #include <stdbool.h>
    #include <string.h>
    
    typedef struct TreeNode {
        int id;
        int val;
        struct TreeNode *left;
        struct TreeNode *right;
    } TreeNode, *TreeNodePtr;
    
    typedef struct ListNode {
        struct TreeNode *node; // 队列的值的类型是树节点指针
        struct ListNode *next;
    } ListNode, *ListNodePtr;
    
    typedef struct Queue {
        ListNodePtr dummyHead;
        ListNodePtr tail;
        int size;
    } *QueuePtr;
    
    // 创建链表的节点
    ListNodePtr createListNode(TreeNodePtr node, ListNodePtr next) {
        ListNodePtr curr = (ListNodePtr) (malloc(sizeof(ListNode)));
        curr->node = node;
        curr->next = next;
        return curr;
    }
    
    // 创建树的节点
    int TreeId = 0;
    
    TreeNodePtr createTreeNode(int val, TreeNodePtr left, TreeNodePtr right) {
        TreeNodePtr curr = (TreeNodePtr) (malloc(sizeof(TreeNode)));
        curr->id = TreeId++;
        curr->val = val;
        curr->left = left;
        curr->right = right;
        return curr;
    }
    
    // 单链表队列初始化
    QueuePtr InitQueue() {
        QueuePtr queue = (QueuePtr) malloc(sizeof(struct Queue));
        TreeNodePtr dummyTreeNode = createTreeNode(-1, NULL, NULL);
        queue->size = 0;
        queue->dummyHead = createListNode(dummyTreeNode, NULL);
        queue->tail = queue->dummyHead;
        return queue;
    }
    
    // 在 queue 的尾部添加一个元素的副本
    void EnQueue(QueuePtr queue, TreeNodePtr node) {
        ListNodePtr curr = createListNode(node, NULL);
        queue->tail->next = curr;
        queue->tail = queue->tail->next;
        queue->size++;
    }
    
    // 删除 queue 中的第一个元素
    void DeQueue(QueuePtr queue) {
        if (queue->size == 0) {
            perror("error! the size of queue is zero when call DeQueue().");
            return;
        }
        ListNodePtr head = queue->dummyHead->next;
        queue->dummyHead->next = head->next;
        queue->size--;
        if (queue->size == 0) queue->tail = queue->dummyHead;
        free(head);
    }
    
    // 如果 queue 中没有元素, 返回 true
    bool QueueEmpty(QueuePtr queue) {
        return queue->size == 0;
    }
    
    // 返回 queue 中第一个元素的引用
    TreeNodePtr GetHead(QueuePtr queue) {
        if (QueueEmpty(queue)) {
            perror("error! the size of queue is zero when call front().");
            return NULL;
        } else {
            return queue->dummyHead->next->node;
        }
    }
    
    int max(int a, int b) {
        return (a >= b) ? a : b;
    }
    
    // 将输入转换为数组
    void getDigits(char *buff, int *data) {
        int len = strlen(buff);
        int index = 0;
        for (int i = 0; i < len; i++) {
            int num = 0;
            if (buff[i] == '#') {
                num = -1;
                i++;
            } else {
                while (buff[i] != ' ' && buff[i] != '\0') {
                    num = num * 10 + (buff[i++] - '0');
                }
            }
            data[index++] = num;
        }
    }
    
    // 删除二叉树
    void destoryTree(TreeNodePtr root) {
        if (!root) return;
        if (root->left) {
            destoryTree(root->left);
            root->left = NULL;
        }
        if (root->right) {
            destoryTree(root->right);
            root->right = NULL;
        }
        free(root);
    }
    
    TreeNodePtr createTreeWithLevelOrder(int *data, int size) {
        if (size == 0) return NULL;
        TreeNodePtr root = createTreeNode(data[0], NULL, NULL);
        QueuePtr queue = InitQueue();
        EnQueue(queue, root);
        int i = 1;
        while (i < size) {
            TreeNodePtr curr = GetHead(queue);
            DeQueue(queue);
            int leftVal = data[i++];
            int rightVal = i < size ? data[i++] : -1;
            if (leftVal != -1) {
                curr->left = createTreeNode(leftVal, NULL, NULL);
                EnQueue(queue, curr->left);
            }
            if (rightVal != -1) {
                curr->right = createTreeNode(rightVal, NULL, NULL);
                EnQueue(queue, curr->right);
            }
        }
        return root;
    }
    
    // 判断是否为左叶子节点
    bool isLeftLeaf(TreeNodePtr node) {
        return node && node->left && !node->left->left && !node->left->right;
    }
    
    int sumOfLeftLeaves(TreeNodePtr root) {
        if (!root) return 0;
        int sum = 0;
        if (isLeftLeaf(root)) {
            sum += root->left->val;
        } else {
            sum += sumOfLeftLeaves(root->left);
        }
        sum += sumOfLeftLeaves(root->right);
        return sum;
    }
    
    int main() {
        char str[] = "3 9 20 # # 15 7";
        int data[7];
        getDigits(str, data);
        TreeNodePtr root = createTreeWithLevelOrder(data, 7);
        int sum = sumOfLeftLeaves(root);
        printf("%d\n", sum);
        destoryTree(root); // 释放内存
        return 0;
    }
    

    希望这些修改能够帮助你解决问题。


    如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 5月12日
  • 请详细说明问题背景 5月7日
  • 创建了问题 5月4日