letcode 分类练习 513.找树左下角的值 112. 路径总和 106.从中序与后序遍历序列构造二叉树

letcode 分类练习 513.找树左下角的值 112. 路径总和 106.从中序与后序遍历序列构造二叉树

513.找树左下角的值

遍历二叉树,并记录当前的深度,如果深度大于最大深度,那么更新该节点,为了保证是最左的,我们规定顺序一定是先遍历左孩子再遍历右孩子

c 复制代码
class Solution {
public:
    int depth = 0;
    int result;
    void getV(TreeNode* root, int d){
        if(!root) return;
        if(!root->left && !root -> right){
            if(d > depth){depth = d; result = root -> val;}
        }
        getV(root -> left, d+1);
        getV(root -> right, d+1);
    }
    int findBottomLeftValue(TreeNode* root) {
        getV(root, 1);
        return result;

    }
};

112. 路径总和

还是对树进行一个dfs遍历,如果当前遍历的节点是叶子节点,就判断当前累计的sum是不是target

c 复制代码
class Solution {
public:
    bool find = false;
    void dfs(TreeNode* root, int sum,int targetSum){
        if(!root) return;
        if(sum  == targetSum && !root->left && !root->right){find = true; return;}
        
        if(root->left)dfs(root->left, sum + root -> left -> val, targetSum);
        if(root->right)dfs(root->right, sum + root -> right -> val, targetSum);
    }
    bool hasPathSum(TreeNode* root, int targetSum) {
        if(!root)return false;
        dfs(root, root -> val, targetSum);
        return find;
    }
};

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

这道题有意思,我们做题的时候构造二叉树都是先找后序序列的最后一个元素是根,然后根据这个根切割中序序列,然后再找中序序列前后两个分割序列,注意我们得到了中序分割的左右子树序列,那么我们可以这个左右子树序列的长度再对后序数组进行一个分割:

积累一个vector查询的方式:

c 复制代码
// 这个查询是[)区间左闭右开
auto y = find(inorder.begin()+in_left, inorder.begin() + in_right + 1, val);
int index = distance(inorder.begin(), y);

总代码如下:

c 复制代码
class Solution {
public:
    TreeNode* build(vector<int>& inorder, vector<int>& postorder, int in_left, int in_right, int po_left,int po_right){
        if(in_left > in_right || po_left > po_right) return nullptr;
        int val = postorder[po_right];
        auto y = find(inorder.begin()+in_left, inorder.begin() + in_right + 1, val);
        int index = distance(inorder.begin(), y);
        int left_length = index - in_left;
        int right_length = in_right - index;
        TreeNode* n = new TreeNode(postorder[po_right]);
        n -> left = build(inorder, postorder, in_left, in_left + left_length -1, po_left, po_left + left_length -1);
        n->right = build(inorder, postorder, in_right - right_length + 1 , in_right, po_right - 1 - right_length + 1, po_right - 1);
        return n;
    }
    TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
        if(inorder.size() == 0) return nullptr;
        return build(inorder, postorder, 0, inorder.size()-1, 0, postorder.size()-1);
    }
};
相关推荐
yi0115 小时前
LeetCode 219:存在重复元素 II——哈希表记录“最近一次出现的位置”
数据结构·人工智能·笔记·python·算法·leetcode·哈希表
灯澜忆梦7 小时前
【面向对象编程C++】| 基础语法
java·c++·算法
小蒋观天下7 小时前
专项方案:大场景港口AI安防、多干扰环境下的算法调优与落地实操
人工智能·深度学习·算法·安全·机器学习·计算机视觉·ai大模型
Evand J8 小时前
【电机滤波例程5】渐消因子自适应扩展卡尔曼滤波(EKF),MATLAB。PMSM负载突变下的状态估计。附下载链接
算法·matlab
H.莓飛8 小时前
【数据结构】二叉树_OJ题
linux·开发语言·数据结构·算法
好想像大佬一样能够ak所有8 小时前
Leetcode35.搜索插入位置
数据结构·算法·leetcode
aqiu1111118 小时前
【C++算法打怪专栏】LeetCode 165. 比较版本号(双指针与字符串流法)
c++·算法·leetcode
黄金龙PLUS9 小时前
如何基于置换算法来设计对称加密算法
算法·网络安全·密码学·哈希算法·同态加密
不会就选b9 小时前
算法日常・每日刷题--<动态规划>14
算法
赛博守夜人9 小时前
跨境业务与出海合规之九:海外买量投放与营销虚假流量(Ad Fraud):跨国机房群控与归因欺诈识别算法
算法·安全