当前位置: 首页 > 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/a/288765.html

相关文章:

  • Matplotlib库中show()函数的用法
  • 【CVPR2024】2024年CVPR的3D 目标检测的综述(还在补充中)
  • apache2配置多站点
  • Mac intel 安装IDEA激活时遇到问题 jetbrains.vmoptions.plist: Permission denied
  • 【设计模式】行为型模式(二):策略模式、命令模式
  • 贪心算法入门(二)
  • 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及其应用