力扣算法刷题 Day 16

513.找树左下角的值

题目链接

513. 找树左下角的值 - 力扣(LeetCode)

思路

要找最左下角的值,我们就需要得知二叉树的深度。自然而然想到层序遍历,遍历的第一个值就是最左下角的。

文章详解

513.找树左下角的值 | 代码随想录

cpp 复制代码
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    int findBottomLeftValue(TreeNode* root) {
        queue <TreeNode *> que;
        //if(root == NULL)    return 0;
        que.push(root);
        int leftval = 0;
        while(!que.empty())
        {
            int size = que.size();
            for(int i = 0; i < size; i++)
            {
                TreeNode * tmp = que.front();
                que.pop();
                if(i==0)   leftval = tmp->val;
                if(tmp->left) que.push(tmp->left);
                if(tmp->right) que.push(tmp->right);
            }
        }
        return leftval;
    }
};

112 路径总和

题目链接

112. 路径总和 - 力扣(LeetCode)

思路

结合之前做过的求所有路径的回溯方法,用递归法,不需要遍历所有节点所以,函数返回值为bool,入口参数为节点和剩余值。结束条件为,当前为叶子节点且剩余值为0,返回true;为叶子节点且值不为0,返回false. 单层循环逻辑:遍历左子树,回溯;遍历右子树,回溯。

文章详解

112. 路径总和 | 代码随想录

cpp 复制代码
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    bool traversal(TreeNode* node, int sum)
    {
        if(node->left == NULL && node->right == NULL && sum == 0)   return true;
        if(node->left == NULL && node->right == NULL) return false;

        if(node->left)
        {
            if(traversal(node->left,sum - node->left->val)) return true;

        }
        if(node->right)
        {
            if(traversal(node->right,sum - node->right->val)) return true;
            
        }
        return false;
    }
    bool hasPathSum(TreeNode* root, int targetSum) {
        if(root == NULL) return false;
        return traversal(root,targetSum - root->val);
    }
};

112 路径总和

题目链接

112. 路径总和 - 力扣(LeetCode)

思路

结合之前做过的求所有路径的回溯方法,用递归法,不需要遍历所有节点所以,函数返回值为bool,入口参数为节点和剩余值。结束条件为,当前为叶子节点且剩余值为0,返回true;为叶子节点且值不为0,返回false. 单层循环逻辑:遍历左子树,回溯;遍历右子树,回溯。

文章详解

112. 路径总和 | 代码随想录

c++ 复制代码
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    bool traversal(TreeNode* node, int sum)
    {
        if(node->left == NULL && node->right == NULL && sum == 0)   return true;
        if(node->left == NULL && node->right == NULL) return false;

        if(node->left)
        {
            if(traversal(node->left,sum - node->left->val)) return true;

        }
        if(node->right)
        {
            if(traversal(node->right,sum - node->right->val)) return true;
            
        }
        return false;
    }
    bool hasPathSum(TreeNode* root, int targetSum) {
        if(root == NULL) return false;
        return traversal(root,targetSum - root->val);
    }
};

113 路径总和ii

题目链接

113. 路径总和 II - 力扣(LeetCode)

思路

接近求所有路径之和的方法。

文章详解

112. 路径总和 | 代码随想录

cpp 复制代码
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
private:
    vector<vector<int>> result;
    vector<int> path;
    // 递归函数不需要返回值,因为我们要遍历整个树
    void traversal(TreeNode* cur, int count) {
        if (!cur->left && !cur->right && count == 0) { // 遇到了叶子节点且找到了和为sum的路径
            result.push_back(path);
            return;
        }

        if (!cur->left && !cur->right) return ; // 遇到叶子节点而没有找到合适的边,直接返回

        if (cur->left) { // 左 (空节点不遍历)
            path.push_back(cur->left->val);
            count -= cur->left->val;
            traversal(cur->left, count);    // 递归
            count += cur->left->val;        // 回溯
            path.pop_back();                // 回溯
        }
        if (cur->right) { // 右 (空节点不遍历)
            path.push_back(cur->right->val);
            count -= cur->right->val;
            traversal(cur->right, count);   // 递归
            count += cur->right->val;       // 回溯
            path.pop_back();                // 回溯
        }
        return ;
    }

public:
    vector<vector<int>> pathSum(TreeNode* root, int sum) {
        result.clear();
        path.clear();
        if (root == NULL) return result;
        path.push_back(root->val); // 把根节点放进路径
        traversal(root, sum - root->val);
        return result;
    }
};

106 二叉树:从中序与后序遍历序列构造二叉树

题目链接

106. 从中序与后序遍历序列构造二叉树 - 力扣(LeetCode)

思路

基本思路是从中序和后序拆分序列,找到根、左子树、右子树。后序序列的最后一个为根,找到中序中该节点对应位置,前面的是左子树,后面的是右子树。依次类推,逐层拆解。

文章详解

106.从中序与后序遍历序列构造二叉树 | 代码随想录

cpp 复制代码
todo
相关推荐
wdfk_prog2 小时前
嵌入式面试真题第 12 题:资源受限长期运行系统的确定性内存管理与内存池架构设计
考研·面试·职场和发展
青山木2 小时前
Hot 100 ---腐烂的橘子
java·数据结构·后端·算法·leetcode·广度优先
未来之窗软件服务2 小时前
计算机考试-快速排序—东方仙盟
数据结构·算法·排序算法·仙盟创梦ide·东方仙盟
小龙报2 小时前
【优选算法】1. 水果成蓝 2.找到字符串中所有字母的异位词
java·c语言·数据结构·数据库·c++·redis·算法
txzrxz3 小时前
数论:排列数、组合数、费马小定理、逆元、同余定理
c++·算法·数论·组合数·费马小定理·逆元·排列数
xqqxqxxq3 小时前
LeetCode Hot100 双指针专项题解笔记
笔记·算法·leetcode
闪电悠米3 小时前
力扣hot100-54.螺旋矩阵-模拟边界控制详解
算法·leetcode·矩阵
变量未定义~4 小时前
虚拟节点-星石传送阵(4星)、强连通分量
数据结构·算法
IT方大同4 小时前
C语言分支与循环语句
c语言·开发语言·算法
思-无-涯4 小时前
测试面试新趋势:工程思维成关键
人工智能·功能测试·测试工具·职场和发展·可用性测试