Leetcode 1302.层数最深子叶结点的和

大家好,今天我给大家分享一下我关于这个题的想法,我这个题过程比较复杂,但大家如果觉得好的话,就请给个免费的赞吧,谢谢了^ _ ^

1.题目要求:

c 复制代码
给你一棵二叉树的根节点 root ,请你返回 层数最深的叶子节点的和 。

举例如图所示:

2.做题思路:

1.先用前序遍历求出树的结点数量:

c 复制代码
void preorder(struct TreeNode* root,int* length){
    if(root == NULL){
        return;
    }
    (*length)++;
    preorder(root->left,length);
    preorder(root->right,length);
}
int* length = (int*)malloc(sizeof(int));
    *length = 0;
    preorder(root,length);

2.然后再根据结点数量用malloc分配两个数组,一个要进行层序遍历,一个要记录树每一层的宽度:

c 复制代码
	//此数组是用来存层序遍历的
	int* treeval = (int*)malloc(sizeof(int)* (*length));
    int j = 0;
    //此数组是用来进行记录树的每层的宽度
    int* col = (int*)malloc(sizeof(int) * (*length + 1));
    int j_1 = 0;

3.然后我们进行层序遍历,设置变量把每一行结点的数量记录下来,再把每个结点存入数组中:

c 复制代码
typedef struct queue{
    struct TreeNode* data;
    struct queue* next;
}queue_t;
//入队
void insert_tail(queue_t** head,struct TreeNode* data)
{
    queue_t* newnode = (queue_t*)malloc(sizeof(queue_t));
    memset(newnode,0,sizeof(queue_t));
    newnode->data = data;
    newnode->next = NULL;
    if(*head == NULL){
        *head = newnode;
        return;
    }
    queue_t* cur = *head;
    while(cur->next != NULL){
        cur = cur->next;
    }
    cur->next = newnode;
}
//出队
struct TreeNode* pop(queue_t** head){
    if(*head == NULL){
        struct TreeNode* x = (*head)->data;
        (*head) = (*head)->next;
        return x;
    }
    struct TreeNode* x = (*head)->data;
    (*head) = (*head)->next;
    return x;
}
	//开始层序遍历
	
    int nextcount = 0;//记录树每一层的结点数量
    queue_t* quence = NULL;
    int size = 0;
    insert_tail(&quence,root);
    size++;
    while(size != 0){
        for(i = 0;i < count;i++){
            struct TreeNode* node = pop(&quence);
            treeval[j] = node->val;
            j++;
            size--;
            if(node->left != NULL){
                insert_tail(&quence,node->left);
                size++;
                nextcount++;
            }
            if(node->right != NULL){
                insert_tail(&quence,node->right);
                size++;
                nextcount++;
            }
        }
        col[j_1] = nextcount;
        j_1++;
        count = nextcount;
        nextcount = 0;
    }

3.全部代码:

c 复制代码
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
typedef struct queue{
    struct TreeNode* data;
    struct queue* next;
}queue_t;
//出队
void insert_tail(queue_t** head,struct TreeNode* data)
{
    queue_t* newnode = (queue_t*)malloc(sizeof(queue_t));
    memset(newnode,0,sizeof(queue_t));
    newnode->data = data;
    newnode->next = NULL;
    if(*head == NULL){
        *head = newnode;
        return;
    }
    queue_t* cur = *head;
    while(cur->next != NULL){
        cur = cur->next;
    }
    cur->next = newnode;
}
//入队
struct TreeNode* pop(queue_t** head){
    if(*head == NULL){
        struct TreeNode* x = (*head)->data;
        (*head) = (*head)->next;
        return x;
    }
    struct TreeNode* x = (*head)->data;
    (*head) = (*head)->next;
    return x;
}
//进行前序遍历
void preorder(struct TreeNode* root,int* length){
    if(root == NULL){
        return;
    }
    (*length)++;
    preorder(root->left,length);
    preorder(root->right,length);
}
int deepestLeavesSum(struct TreeNode* root) {
    int* length = (int*)malloc(sizeof(int));
    *length = 0;
    preorder(root,length);
    int* treeval = (int*)malloc(sizeof(int)* (*length));
    int j = 0;
    int* col = (int*)malloc(sizeof(int) * (*length + 1));
    int j_1 = 0;
    int count = 1;
    col[j_1] = count;
    j_1++;
    int i = 0;
    //记录树的每一层的宽度
    int nextcount = 0;
    queue_t* quence = NULL;
    int size = 0;
    insert_tail(&quence,root);
    size++;
    while(size != 0){
        for(i = 0;i < count;i++){
            struct TreeNode* node = pop(&quence);
            treeval[j] = node->val;
            j++;
            size--;
            if(node->left != NULL){
                insert_tail(&quence,node->left);
                size++;
                nextcount++;
            }
            if(node->right != NULL){
                insert_tail(&quence,node->right);
                size++;
                nextcount++;
            }
        }
        col[j_1] = nextcount;
        j_1++;
        count = nextcount;
        nextcount = 0;
    }
    int count1 = col[j_1 - 2];
    int sum = 0;
    int f = 0;
    for(i = j - 1;i >= 0;i--){
       sum += treeval[i];
       f++;
       if(f == count1){
            break;
       }
    }
    return sum;
}

好了,这就是我全部代码大家如果觉得好的话,就请给个免费的赞吧,谢谢了^ _ ^ .

相关推荐
变量未定义~39 分钟前
最小生成树1(Prim模板)、最小生成树2(kruskal模板)、最近公共祖先(模板)
算法
这就是佬们吗43 分钟前
Python入门⑤-异常处理、文件操作与实战项目
开发语言·数据库·python·算法·pycharm
LONGZETECH1 小时前
新能源汽车充电设备装配与调试仿真教学软件 技术架构与核心实现解析
大数据·算法·3d·unity·架构·汽车
自学小白菜1 小时前
关于提升机器学习算法做预测回归任务精度的方法分享
算法·机器学习·回归·提升精度
学废了wuwu1 小时前
从入门到实战:深入浅出模型压缩三大核心——剪枝、彩票假设与知识蒸馏
人工智能·算法·剪枝
小肝一下1 小时前
3. 单链表
c语言·数据结构·c++·算法·leetcode·链表·dijkstra
劈星斩月1 小时前
监督学习算法 之 决策树
学习·算法·决策树
学计算机的计算基1 小时前
操作系统内存管理全解:虚拟内存、页表、COW、malloc、OOM一篇搞定
java·笔记·算法
tachibana21 小时前
hot100 前 K 个高频元素(347)
java·数据结构·算法·leetcode
陈天伟教授2 小时前
暴力美学-大型语言模型与涌现:一个复杂系统视角
人工智能·算法