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

代码随想录第二十天 | 513. 找树左下角的值,路径总和,106. 从中序与后序遍历序列构造二叉树

513. 找树左下角的值 

第一想法:感觉用层序遍历比用递归遍历容易很多,层序遍历好久没写了,先试试。只会写遍历模板,其余的不太会写了...

看完想法:层序遍历还是复习一下。在que.push(root)前,先验证一下root是否为空。并用一个vector<vector<int>> vec 和 vector<int> tmp分别存储层序遍历后的二叉树和每层的二叉树。按照模板更改的话,只需要记录每行的第一个元素就可以了,到最后就会覆盖成最后一行的第一个的。在往深层遍历时,应该选用记录front的变量去递归,而不是root

递归想法:建立两个全局变量,一个存储最大深度,一个存储最大深度的最大值,然后使用回溯

//层序遍历法
int findBottomLeftValue(TreeNode* root) {
        queue<TreeNode*> que;
        if(root != nullptr) que.push(root);
        int result = 0;
        while(!que.empty()){
            int size = que.size();//每层的大小是不一样的
            
            for(int i = 0; i< size; i++){
                TreeNode* tmp = que.front();
                que.pop();
                if(i == 0 ) result =  tmp->val;
                if(tmp->left) que.push(tmp->left);
                if(tmp->right) que.push(tmp->right);
            }
        }
        return result;

    }
class Solution {
public:
    int maxDepth = INT_MIN;
    int result;
    void traversal(TreeNode* root, int depth) {
        if (root->left == NULL && root->right == NULL) {
            if (depth > maxDepth) {
                maxDepth = depth;
                result = root->val;
            }
            return;
        }
        if (root->left) {
            depth++;
            traversal(root->left, depth);
            depth--; // 回溯
        }
        if (root->right) {
            depth++;
            traversal(root->right, depth);
            depth--; // 回溯
        }
        return;
    }
    int findBottomLeftValue(TreeNode* root) {
        traversal(root, 0);
        return result;
    }
};

路径总和

第一想法:使用回溯,设置两个全局变量,用来存储bool和每次路径上的总和,但是好像有一种情况报错了

看完想法:注意,设置的全局变量不能成为局部函数的形参,这样会有歧义!正确做法是,当作一个变量就行;在回溯时,加入的应该是下一个即将要遍历的元素,即root->left->val而不是当前的元素值。

if (!cur->left && !cur->right && count == 0) return true; // 遇到叶子节点,并且计数为0
if (!cur->left && !cur->right) return false; // 遇到叶子节点直接返回

 在回溯中,遇到合适的路径要及时返回,如这里就是if(traversal) return true;

在路径搜索Ⅱ中,由于不需要对返回值作处理,所以递归函数的返回值是void

vector<vector<int>> result;
    vector<int> path;
    void traversal(TreeNode* root, int count){
        if(!root->left && !root->right && count==0){
            result.push_back(path);
        }
        if(!root->left && !root->right) return ;
        
        
        if(root->left){
            count-=root->left->val;
            path.push_back(root->left->val);
            traversal(root->left, count);
            count+=root->left->val;
            path.pop_back();
        }
        if(root->right){
            count-=root->right->val;
            path.push_back(root->right->val);
            traversal(root->right, count);
            count+=root->right->val;
            path.pop_back();
        }
    }


    vector<vector<int>> pathSum(TreeNode* root, int targetSum) {
        if(root==nullptr) return result;
        path.push_back(root->val);
        traversal(root, targetSum-root->val);
        return result;

    }

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

第一想法:


http://www.kler.cn/news/288765.html

相关文章:

  • react|useState的异步渲染
  • 【AIGC】ChatGPT 3.5/4.0 新手使用手册
  • 【pyhton】python如何实现将word等文档中的文字转换成语音
  • 如何用Python 下载B站上的视频
  • SQL【2】稍稍进阶
  • 无人机图传通信模组,抗干扰、稳定传输,8公里图传模组原理
  • 最长回文子串:动态规划推导
  • JAVA 手机部件功耗计算
  • 魅力中国:全球消费者 “反向海淘” 首选,淘宝代购集运系统搭建秘籍
  • 趣味算法------单一背包问题(01背包问题)贪心算法解决
  • 安防视频综合管理系统EasyCVR视频汇聚平台集群部署出现状态不同步的情况是什么原因?
  • 遥控器显示分别对应的无人机状态详解!!
  • VUE2.0 elementUI el-input-number 数据更新,视图不更新——基础积累
  • 使用idea快速创建springbootWeb项目(springboot+springWeb+mybatis-Plus)
  • 2.SpringBoot项目pom.xml文件配置
  • 【安卓面试】
  • 科学高效的FPGA编程方法
  • 从0到DevOps(1)-初步了解DevOps和容器
  • Nginx集成第三方负载均衡模块:配置指南与实践
  • 正则表达式模块re及其应用
  • 在K8s上运行GitHub Actions的自托管运行器
  • Swift 可选类型
  • 快速入门Pytorch
  • 搭子小程序开发,让社交更加有趣
  • AI赚钱成功案例|像素级拆解一键生成提示词 文生图 图生视频
  • Python 多目标跟踪-匈牙利算法
  • ArcGIS Pro SDK (十二)布局 7 组元素
  • Java算法之LRUCache缓存实现
  • 关于武汉芯景科技有限公司的A/D转换芯片XJ3021开发指南(兼容MCP3021)
  • 如何在已安装的最小化银河麒麟高级服务器操作系统上安装图形化界面