每日一题·513.找树左下角的值

题目

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

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

示例

每日一题·513.找树左下角的值_第1张图片

 

思路

题目是要最后一层左边第一个,不是最后一层第一个左子树,这两个是不同的概念,第一个是第一个节点,不分左右

**深度优先**

我们可以递归访问一棵树,每次都先访问左边节点,这样我们永远先访问到左边,然后定义一个高度,当访问大于这个高度时,说明我们访问到了新的一层,结合上一步我们永远先访问左边节点然后又是新的一层,说明我们每次都是先访问最后一层第一个节点,保存这个值,之后相同高度的我们不在理会

**广度优先**

广度优先 -> 层次遍历 -> 使用时通常与队列联系

我们创建一个队列,保存我们遍历的树节点,队列数据每出队一次,就访问一次是否存在左节点和右节点,存在入队,不存在则出队下一个元素,这样就实现了层次遍历,但是我们题目要求是输出最后一层左边第一个元素,如果按层次遍历,我们输出的就是最后一层右边第一个元素了,换句话说就是最后一层左边最后一个元素,那么我们只有修改一下,每次先访问右节点,因为队列是先进先出,右节点先被访问,说明右节点先出队,那么剩下的就是左节点,我们只需要输出队列最后一个元素即可,因为队列最后一个就是左边第一个元素

代码

**深度优先**

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
void dfs(const struct TreeNode *root, int height, int *curVal, int *curHeight) {
    if(root == NULL)
        return;
    height++;
    dfs(root->left , height , curVal , curHeight);//先访问左节点
    dfs(root->right , height , curVal , curHeight);//再访问右节点
    if(height > *curHeight)//保存遍历到新高度的第一个节点,因为优先左节点遍历,所以肯定是左边第一个
    {
        *curHeight = height;
        *curVal = root->val;
    }
}
/*
*findBottomLeftValue:寻找树最下一层 左边第一个节点
struct TreeNode* root:树的头结点
返回值:树最后一层 左边第一个节点
*/
int findBottomLeftValue(struct TreeNode* root){
    int curVal , curHeight = 0;
    dfs(root , 0 , &curVal , &curHeight);
    return curVal;
}

**广度优先**

#define MAX_NODE_SIZE 10000//设置队列长度
/*
*findBottomLeftValue:寻找树最下一层 左边第一个节点
struct TreeNode* root:树的头结点
返回值:树最后一层 左边第一个节点
*/
int findBottomLeftValue(struct TreeNode* root){
    int ret;
    struct TreeNode** queue = (struct TreeNode **)malloc(sizeof(struct TreeNode) * MAX_NODE_SIZE);
    int head = 0;
    int tail = 0;
    queue[tail++] = root;//头结点先入队
    while (head != tail) {//队列中存在元素,进行出队,不存在元素时结束
        struct TreeNode *p = queue[head++];//出队
        if (p->right) {//右节点是否存在
            queue[tail++] = p->right;
        }
        if (p->left) {//左节点是否存在
            queue[tail++] = p->left;
        }
        ret = p->val;
    }
    free(queue);
    return ret;
}
。

时间空间复杂度

每日一题·513.找树左下角的值_第2张图片

 

你可能感兴趣的:(LeetCode刷题笔记,算法,c语言,数据结构)