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

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

^ _ ^

相关推荐
DK2215123 分钟前
机器学习系列-----主成分分析(PCA)
人工智能·算法·机器学习
oliveira-time29 分钟前
爬虫学习8
开发语言·javascript·爬虫·python·算法
点云侠1 小时前
二维椭圆拟合算法及推导过程
开发语言·c++·算法·计算机视觉·matlab
一直学习永不止步1 小时前
LeetCode题练习与总结:迷你语法分析器--385
java·数据结构·算法·leetcode·字符串··深度优先搜索
Dragonlongbo1 小时前
leetcode01 --- 环形链表判定
算法·leetcode·职场和发展
-cc- Lynn1 小时前
链表类算法【leetcode】
算法·leetcode·链表
顾京2 小时前
基于扩散模型的表单插补
人工智能·深度学习·算法
小冉在学习2 小时前
day55 图论章节刷题Part07([53.寻宝]prim算法、kruskal算法)
java·算法·图论
学无止境\n2 小时前
[c语言]strcat函数的使用和模拟实现
c语言·开发语言·算法
五味香2 小时前
Linux命令学习,git命令
linux·c语言·开发语言·c++·git·学习·算法