leetcode 513.找树左下角的值

1.题目要求:

代码块:

c 复制代码
给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。

假设二叉树中至少有一个节点。

 

2.此题思路:

1.创建队列,出队函数和入队函数:

c 复制代码
//创建队列
typedef struct queuet{
    struct TreeNode* value;
    struct queue* next;
}queue_t;
//入队
void push(queue_t** head,struct TreeNode* data){
    queue_t* newnode = (queue_t*)malloc(sizeof(queue_t));
    newnode->value = data;
    newnode->next = NULL;
    if(*head == NULL){
        *head = newnode;
        return;
    }
    queue_t* tail = *head;
    while(tail->next != NULL){
        tail = tail->next;
    }
    tail->next = newnode;
}
//出队
struct TreeNode* pop(queue_t** head){
    struct TreeNode* x = (*head)->value;
    (*head) = (*head)->next;
    return x;
}

2.创建两个数组,一个用于层序遍历,一个用于记录树每层的结点个数:

c 复制代码
queue_t* enquence = NULL;
    int size = 0;
    int count = 1;//当前行的结点数
    int nextcount = 0;//记录树下一行的结点数
    int* number = (int*)malloc(sizeof(int) * 10000);//用来层序遍历
    int j1 = 0;
    int* low = (int*)malloc(sizeof(int) * 10000);//用来记录树每层的结点个数
    int j2 = 0;
  1. 层序遍历:
c 复制代码
push(&enquence,root);//入队
    size++;
    //进行层序遍历
    while(size != 0){ 
        for(int i = 0;i <  count;i++){
            struct TreeNode* temp = pop(&enquence);//出队
            size--;
            number[j1] = temp->val;//往数组里存入结点值
            j1++;
            if(temp->left != NULL){
                push(&enquence,temp->left);//入队
                nextcount++;//此代表下一行的节点数
                size++;
            }
            if(temp->right != NULL){
                push(&enquence,temp->right);//入队
                nextcount++;
                size++;
            }
        }
        low[j2] = count;
        j2++;
        count = nextcount;
        nextcount = 0;
    }

4.取记录行结点数的数组的最后一个,最后让另一个数组,从后向前走,直到 等于记录节点数的最后一个:

c 复制代码
count = low[j2 - 1];
    int count1 = 1;
    for(int i = j1 - 1;i >= 0;i--){
        if(count1 == count){
            return number[i]; 
        }
        count1++;
    }
    return 0;

全部代码:

c 复制代码
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
 //创建队列
typedef struct queuet{
    struct TreeNode* value;
    struct queue* next;
}queue_t;
//入队
void push(queue_t** head,struct TreeNode* data){
    queue_t* newnode = (queue_t*)malloc(sizeof(queue_t));
    newnode->value = data;
    newnode->next = NULL;
    if(*head == NULL){
        *head = newnode;
        return;
    }
    queue_t* tail = *head;
    while(tail->next != NULL){
        tail = tail->next;
    }
    tail->next = newnode;
}
//出队
struct TreeNode* pop(queue_t** head){
    struct TreeNode* x = (*head)->value;
    (*head) = (*head)->next;
    return x;
}
int findBottomLeftValue(struct TreeNode* root) {
    queue_t* enquence = NULL;
    int size = 0;
    int count = 1;//当前行的结点数
    int nextcount = 0;//记录树下一行的结点数
    int* number = (int*)malloc(sizeof(int) * 10000);//用来层序遍历
    int j1 = 0;
    int* low = (int*)malloc(sizeof(int) * 10000);//用来记录树每层的结点个数
    int j2 = 0;
    push(&enquence,root);
    size++;
    //进行层序遍历
    while(size != 0){ 
        for(int i = 0;i <  count;i++){
            struct TreeNode* temp = pop(&enquence);
            size--;
            number[j1] = temp->val;
            j1++;
            if(temp->left != NULL){
                push(&enquence,temp->left);
                nextcount++;
                size++;
            }
            if(temp->right != NULL){
                push(&enquence,temp->right);
                nextcount++;
                size++;
            }
        }
        low[j2] = count;
        j2++;
        count = nextcount;
        nextcount = 0;
    }
    count = low[j2 - 1];
    int count1 = 1;
    for(int i = j1 - 1;i >= 0;i--){
        if(count1 == count){
            return number[i]; 
        }
        count1++;
    }
    return 0;
}

我这个时间复杂度较高,但大家如果觉得好的话,就请给个免费的赞吧,谢谢了

^ _ ^

相关推荐
大怪v1 小时前
前端:人工智能?我也会啊!来个花活,😎😎😎“自动驾驶”整起!
前端·javascript·算法
惯导马工3 小时前
【论文导读】ORB-SLAM3:An Accurate Open-Source Library for Visual, Visual-Inertial and
深度学习·算法
骑自行车的码农5 小时前
【React用到的一些算法】游标和栈
算法·react.js
博笙困了5 小时前
AcWing学习——双指针算法
c++·算法
moonlifesudo5 小时前
322:零钱兑换(三种方法)
算法
NAGNIP1 天前
大模型框架性能优化策略:延迟、吞吐量与成本权衡
算法
美团技术团队1 天前
LongCat-Flash:如何使用 SGLang 部署美团 Agentic 模型
人工智能·算法
Fanxt_Ja1 天前
【LeetCode】算法详解#15 ---环形链表II
数据结构·算法·leetcode·链表
侃侃_天下1 天前
最终的信号类
开发语言·c++·算法
茉莉玫瑰花茶1 天前
算法 --- 字符串
算法