当前位置: 首页 > article >正文

代码随想录day16

513.
这个题是要找最低层的最左边节点的值,因此用递归的话需要判断是不是最底层相对较难。比较简单的写法是利用层序遍历访问每一层记录最左边节点的值。

/*
 * @lc app=leetcode.cn id=513 lang=cpp
 *
 * [513] 找树左下角的值
 */

// @lc code=start
/**
 * 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) {}
 * };
 */
#include<iostream>
#include<queue>
using namespace std;

class Solution {
public:
    int findBottomLeftValue(TreeNode* root) {
        queue<TreeNode*>que;
        if(root!=NULL)
        que.push(root);
        int  result=0;
        while(!que.empty()){
            int size=que.size();
            for(int i=0;i<size;i++){
                TreeNode* node=que.front();
                que.pop();
                if(i==0)result=node->val;//记录最左边节点的值
                if(node->left)
                que.push(node->left);
                if(node->right)
                que.push(node->right);
            }
        }
        return result;
        
    }
};
// @lc code=end

112.

弄清楚回溯与终止条件。

/*
 * @lc app=leetcode.cn id=112 lang=cpp
 *
 * [112] 路径总和
 */

// @lc code=start
/**
 * 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) {}
 * };
 */
#include<iostream>
using namespace std;
class Solution {
public:
    bool traversal(TreeNode* cur,int count){
         if (!cur->left && !cur->right && count == 0) return true; // 遇到叶子节点,并且计数为0
        if (!cur->left && !cur->right) return false; // 遇到叶子节点直接返回

        if (cur->left) { // 左
            count -= cur->left->val; 
            // 递归,处理节点;
            if (traversal(cur->left, count)) return true;
            count += cur->left->val; // 回溯,撤销处理结果
        }
        if (cur->right) { // 右
            count -= cur->right->val; 
            // 递归,处理节点;
            if (traversal(cur->right, count)) return true;
            count += cur->right->val; // 回溯,撤销处理结果
        }
        return false;
    }
    bool hasPathSum(TreeNode* root, int targetSum) {
         if (root == NULL) return false;
        return traversal(root, targetSum - root->val);
    }
};
// @lc code=end

106.

还没弄清,周末再看看

/*
 * @lc app=leetcode.cn id=106 lang=cpp
 *
 * [106] 从中序与后序遍历序列构造二叉树
 */

// @lc code=start
/**
 * 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:
    TreeNode* traversal (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;
        }

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

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

        // 切割后序数组
        // 依然左闭右开,注意这里使用了左中序数组大小作为切割点
        // [0, leftInorder.size)
        vector<int> leftPostorder(postorder.begin(), postorder.begin() + leftInorder.size());
        // [leftInorder.size(), end)
        vector<int> rightPostorder(postorder.begin() + leftInorder.size(), postorder.end());

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

        return root;
    }
public:
    TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
        if (inorder.size() == 0 || postorder.size() == 0) return NULL;
        return traversal(inorder, postorder);
    }
};
// @lc code=end

 

 


http://www.kler.cn/a/516260.html

相关文章:

  • 《鸿蒙Next应用商店:人工智能开启智能推荐与运营新时代》
  • 【2024年华为OD机试】(A卷,200分)- 优雅子数组 (JavaScriptJava PythonC/C++)
  • Node.js——express中间件(全局中间件、路由中间件、静态资源中间件)
  • 高效安全文件传输新选择!群晖NAS如何实现无公网IP下的SFTP远程连接
  • Django 的 `Meta` 类和外键的使用
  • 二、vue智能Ai对话(高仿通义千问)流式进阶版
  • 一键视频转文字/音频转文字,浏览器右键提取B站视频文案,不限时长免费无限次可用
  • CRM项目的开发与调试整体策略
  • Flutter鸿蒙化中的Plugin
  • SpringCloud系列教程:微服务的未来(十五)实现登录校验、网关传递用户、OpenFeign传递用户
  • (Java版本)基于JAVA的网络通讯系统设计与实现-毕业设计
  • 2018 秋招 百度二轮面试---血淋淋的经历写实
  • 重构(4)
  • ruoyi-vue-plus 引入 ShardingSphere-JDBC 实现分库分表
  • docker 部署.netcore应用优势在什么地方?
  • Linux下Ubuntun系统报错find_package(BLAS REQUIRED)找不到
  • 华为OD机试E卷 --树状结构查询--24年OD统一考试(Java JS Python C C++)
  • 概率密度函数(PDF)分布函数(CDF)——直方图累积直方图——直方图规定化的数学基础
  • 智源研究院与乐聚机器人成立具身智能联合实验室
  • 深度学习实战图像OCR识别
  • 【博客之星】2024年度创作成长总结 - 面朝大海 ,春暖花开!
  • STM32——LCD
  • Spring Boot中选择性加载Bean的几种方式
  • 如何使用 Node.js 构建一个简单的 API?
  • Python语言的安全开发
  • 把 PVE 下的机械硬盘(非SSD系统盘)分配给虚拟机使用