第18天-代码随想录刷题训练-第六章● 513.找树左下角的值 ● 112. 路径总和 113.路径总和ii ● 106.从中序与后序遍历序列构造二叉树 105.从前序与中序遍历序列构造二叉树

这篇具有很好参考价值的文章主要介绍了第18天-代码随想录刷题训练-第六章● 513.找树左下角的值 ● 112. 路径总和 113.路径总和ii ● 106.从中序与后序遍历序列构造二叉树 105.从前序与中序遍历序列构造二叉树。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.树左下角的值 (指的是最后一层的第一个值,而不是左右一层的左叶子节点的值)

- LeetCode链接

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

  • 遍历顺序,因为本题要求的是 最后一层最左边的节点,因此只要遍历顺序 左节点在右节点前就行,因此 任何遍历顺序都可以
  • 本题中的中节点 不需要处理逻辑,只需要判断是否到了叶子节点,并且判断当前遍历的叶子节点的深度是否是大于maxDepth
class Solution {
public:

    int maxDepth = INT_MIN;
    int result;
    void travel(TreeNode* root, int depth){
        if(root->left == NULL && root->right == NULL){
             if(depth > maxDepth){
                 result = root->val;
                 maxDepth = depth;
             }
             return ;
        }

        if(root->left){
            travel(root->left, depth+1);
        }

        if(root->right){
            travel(root->right, depth+1);
        }
        
        return ;
    }

    int findBottomLeftValue(TreeNode* root) {
        travel(root, 0);
        return result;
    }
};

2.路径总和i 和 ii

- LeetCode链接1
- LeetCode链接2

路径总和 i

给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。

class Solution {
public:
    bool hasPathSum(TreeNode* root, int targetSum) {
        if(root==NULL) return false;
        // 使用叶子节点判断
        if(root->left == NULL && root->right == NULL){          // 判断到达了叶子节点
            if(targetSum == root->val) return true;
            else return false;
        }

        // if(root == NULL && targetSum == 0) return true;
        // else if(root == NULL && targetSum != 0) return false;
        targetSum -= root->val;
        bool left_flag = hasPathSum(root->left, targetSum);
        bool right_flag = hasPathSum(root->right, targetSum);

        return left_flag || right_flag;
    }
};

路径总和 ii

给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。

class Solution {
public:
    vector<vector<int>> result;
    vector<int> temVec;

    void travel(TreeNode* root, int targetSum){
        temVec.push_back(root->val);

        if(root->left == NULL && root->right == NULL && root->val==targetSum){
            result.push_back(temVec);
            return ;
        }
        if(root->left == NULL && root->right == NULL) return ;

        // 中
        if(root->left){
            travel(root->left, targetSum-root->val);
            temVec.pop_back();
        }
        if(root->right){
            travel(root->right, targetSum-root->val);
            temVec.pop_back();
        }

        return ;
    }

    vector<vector<int>> pathSum(TreeNode* root, int targetSum) {
        if(root == NULL) return result;

        travel(root, targetSum);
        return result;
    }
};

3.中序和后序遍历构造二叉树

- LeetCode链接文章来源地址https://www.toymoban.com/news/detail-443560.html

class Solution {
public:

    TreeNode* travel(vector<int>& inorder, vector<int>& postorder){
        if(postorder.size() == 0) return NULL;

        // 后序遍历的数组的最后一个元素是 当前的中间节点
        int rootValue = postorder[postorder.size() - 1];
        TreeNode* root = new TreeNode(rootValue);

        // 判断是否是叶子节点
        if(postorder.size() == 1) return root;

        // 找到中序遍历的切割点
        int delimiterIndex;
        for(delimiterIndex = 0; delimiterIndex < inorder.size(); delimiterIndex++){
            if(inorder[delimiterIndex] == rootValue) break;
        }

        // 切割中序数组  左闭右开区间
        vector<int> leftInorder(inorder.begin(), inorder.begin() + delimiterIndex);
        vector<int> rightInorder(inorder.begin()+delimiterIndex+1, inorder.end());

        // postorder舍弃末尾元素
        postorder.resize(postorder.size()- 1);

        // 切割后续数组
        vector<int> leftPostorder(postorder.begin(), postorder.begin() +leftInorder.size());
        vector<int> rightPostorder(postorder.begin()+leftInorder.size(), postorder.end());

        root->left = travel(leftInorder, leftPostorder);
        root->right = travel(rightInorder, rightPostorder);

        return root;
    }

    TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
      if(inorder.size() == 0  || postorder.size() == 0) return NULL;
      return travel(inorder, postorder);

    }
};

到了这里,关于第18天-代码随想录刷题训练-第六章● 513.找树左下角的值 ● 112. 路径总和 113.路径总和ii ● 106.从中序与后序遍历序列构造二叉树 105.从前序与中序遍历序列构造二叉树的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【代码随想录】刷题Day35

    860. 柠檬水找零 1.如果第一个顾客没有五元,那么直接返回false,因为店主开始没有零钱 2.定义两个int,一个记录5元,一个记录10元,随后遍历整个数组,会出现三种情况: 如果顾客给5元,直接num5加一 如果顾客给10元,判断num5是否大于0,大于则num5--,num10++;反之返回false

    2024年02月06日
    浏览(23)
  • 【代码随想录】刷题Day36

    435. 无重叠区间 先从小到大排序,其实本题依然是求出共同区域,只不过题目需要我们删除尽量少的区间。所以我们需要删除的一定是范围跨度大的并且跟其他有公共区间的区域。所以每次更新右边范围都需要考虑最小的范围。 1.if(intervals[i][0]end),说明有重复的区间,那么我

    2024年02月07日
    浏览(33)
  • 【代码随想录】刷题Day31

    455. 分发饼干 贪心的思路就是:小的饼干尽量去匹配胃口小的孩子,这样才能实现尽可能多孩子吃到。 那么代码就很好写了: 1.排序g和s,这样方便查找小的数 2.饼干的位置不停遍历,对应我们需要一个ret代表当前孩子位置 3.如果当前位置为孩子的数量,说明ret记录下所有的

    2024年02月06日
    浏览(25)
  • 【代码随想录】刷题Day41

    343. 整数拆分 1.dp数组的含义:第i个就表示当前i能被拆分出相乘最大的整数 2.那么其实,所谓的后续的i对应的相乘最大整数其实就是前面的相乘最大整数拼凑而成,为了更好的区分我们将分离出来的数为j,那么我们的工作就是将一个又一个的j从i中剥离出,随后相乘即可。那

    2024年02月07日
    浏览(30)
  • 代码随想录刷题笔记3

    本质上:穷举 + 剪枝。 回溯法就是解决这种k层for循环嵌套的问题。 for循环横向遍历,递归纵向遍历,回溯不断调整结果集。 注意画出 解空间树-N叉树。 组合无序,排列有序。 N叉树的宽度——横向遍历,N叉树的高度——纵向遍历。 而ans.push,path 是一个 std::vector 对象,当

    2024年02月02日
    浏览(38)
  • 【代码随想录】刷题Day4

    24. 两两交换链表中的节点 前后指针实现 1.没有元素或者只有一个元素无意义 2.给出一个前驱prev,以及用来交换的两个节点cur和next 3.我当时是这么想的,如果两个指针一起动,那么就要用cur和next同时判断结束,也许这个条件会比较苛刻(我就烦这种边界条件),所以我觉得动一

    2023年04月22日
    浏览(33)
  • 【代码随想录】刷题Day6

    242. 有效的字母异位词 直接使用库函数的multiset来判断 其实没什么好说的,因为字符串有重复的可以出现所以用的multiset 缺点:确实浪费空间,红黑树的插入删除,浪费时间 2.数组实现 26个小写字母,而且是连续的,那么我们直接用数组来存储也可以的 1.那么映射的方式也很

    2024年02月02日
    浏览(46)
  • 代码随想录刷题day 2

    977.有序数组的平方 双index法: vectorint result(nums.size(),0)创建一个新的数组用来存结果。 i用来指向起始位置;j用来指向结尾的位置,取了起始位置的时候就i++,采用了结尾的位置的时候就j--,直到i与j相遇; 209.长度最小的子数组 滑动窗口法, 和双index法差不多的意思: 创建一

    2024年02月05日
    浏览(27)
  • 代码随想录刷题 Day15

    1. 二叉树遍历的层序方法, 记住模板后可以做下面十道题,现在暂时只做了102; 102.二叉树的层序遍历 107.二叉树的层次遍历II 199.二叉树的右视图 637.二叉树的层平均值 429.N叉树的层序遍历 515.在每个树行中找最大值 116.填充每个节点的下一个右侧节点指针 117.填充每个节点的

    2024年02月06日
    浏览(34)
  • 代码随想录刷题 Day14

    二叉法的前中后序的遍历, 前中后所说的是根节点输出的顺序;  有两种遍历方式, 1. 递归法 (自己调用自己,本质是用栈) 代码比较简单,但是需要创建一个额外的函数来进行自己调用自己的过程;用递归法的话三种遍历方式只需要改变代码的位置就可以。 Leetcode 对应

    2024年02月08日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包