day25【代码随想录】左叶子之和、找树左下角的值、从中序与后序遍历序列构造二叉树、从中序与前序遍历序列构造二叉树、最大二叉树

news2025/11/1 5:05:03

文章目录

  • 前言
  • 一、左叶子之和(力扣404)
    • 1、递归遍历
    • 2、非递归遍历
  • 二、找树左下角的值(力扣513)
    • 1、迭代法(层序遍历)
    • 2、递归法
  • 三、从中序与后序遍历序列构造二叉树(力扣106)
  • 四、从中序与前序遍历序列构造二叉树(力扣105)
  • 五、最大二叉树(力扣654)


前言

1、左叶子之和
2、找树左下角的值
3、从中序与后序遍历序列构造二叉树
4、从中序与前序遍历序列构造二叉树
5、最大二叉树


一、左叶子之和(力扣404)

给定二叉树的根节点 root ,返回所有左叶子之和。
在这里插入图片描述
思路:
判断当前节点是不是左叶子是无法判断的,必须要通过节点的父节点来判断其左孩子是不是左叶子。

if (node->left != NULL && node->left->left == NULL && node->left->right == NULL) {
    左叶子节点处理逻辑
}

1、递归遍历

class Solution {
    int res=0;
    public int sumOfLeftLeaves(TreeNode root) {
        //递归遍历
        if(root==null) return 0;
        postOrder(root);
        return res;
    }
    public void postOrder(TreeNode node){
        if(node==null) return ;
        postOrder(node.left);
        postOrder(node.right);
        if(node.left!=null && node.left.left==null && node.left.right==null){
            res += node.left.val;
        }
    }
}

2、非递归遍历

class Solution {

    public int sumOfLeftLeaves(TreeNode root) {
        //非递归遍历
        int res=0;
        if(root==null) return res;
        Stack<TreeNode> stack = new Stack<>();
        stack.push(root);
        while(!stack.isEmpty()){
            TreeNode node = stack.pop();
            if(node.left!=null && node.left.left==null && node.left.right==null){
                res += node.left.val;
            }
            if(node.right!=null){
                stack.push(node.right);
            }
            if(node.left!=null){
                stack.push(node.left);
            }
        }
        return res;
    }
}

在这里插入图片描述

二、找树左下角的值(力扣513)

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

假设二叉树中至少有一个节点。
在这里插入图片描述
最底层:深度最大
最左边

1、迭代法(层序遍历)

最后一层的第一个值就是所要求的结果值

class Solution {
    public int findBottomLeftValue(TreeNode root) {
        List<List<Integer>> res = new ArrayList<>();
        Queue<TreeNode> que = new LinkedList<>();
        if(root==null) return 0;
        que.offer(root);
        while(!que.isEmpty()){
            int len = que.size();
            List<Integer> itemList = new ArrayList<>();
            while(len-->0){
                TreeNode node = que.poll();
                itemList.add(node.val);
                if(node.left!=null){
                    que.offer(node.left);
                }
                if(node.right!=null){
                    que.offer(node.right);
                }
            }
            res.add(itemList);
        }
        return res.get(res.size()-1).get(0);
    }
}

2、递归法

class Solution {
    private int Deep = -1; //深度
    private int value = 0; //结果值
    public int findBottomLeftValue(TreeNode root) {
       //递归法
       value = root.val;
       findLeftValue(root,0);7
       return value;
    }
    public void findLeftValue(TreeNode root,int deep){
        if(root==null) return ;
        if(root.left==null && root.right==null){
            //叶子节点
            if(deep>Deep){
                value = root.val;
                Deep = deep;
            }
        }
        if(root.left!=null){
            deep++;
            findLeftValue(root.left,deep);
            deep--; //回溯
        }
        if(root.right!=null){
            deep++;
            findLeftValue(root.right,deep);
            deep--; //回溯
        }
    }
}

在这里插入图片描述

三、从中序与后序遍历序列构造二叉树(力扣106)

给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。

在这里插入图片描述
图解:
在这里插入图片描述
第一步:如果数组大小为零的话,说明是空节点了。

第二步:如果不为空,那么取后序数组最后一个元素作为节点元素。

第三步:找到后序数组最后一个元素在中序数组的位置,作为切割点

第四步:切割中序数组,切成中序左数组和中序右数组 (顺序别搞反了,一定是先切中序数组)

第五步:切割后序数组,切成后序左数组和后序右数组

第六步:递归处理左区间和右区间

class Solution {
    Map<Integer,Integer> map;
    public TreeNode buildTree(int[] inorder, int[] postorder) {
        map = new HashMap<>();
        for(int i=0;i<inorder.length;i++){
            map.put(inorder[i],i);
        }
        return findNode(inorder,0,inorder.length,postorder,0,postorder.length);
    }
        //切割中序数组  左中序[0,index] [index+1,length-1]
        //切割后序数组  用切割中序数组拿到的左中序数组 来切左后中序
    public TreeNode findNode(int[] inorder,int inBegin,int inEnd,int[] postorder,int postBegin,int postEnd){
        if(inBegin >= inEnd || postBegin >= postEnd){
            return null;
        }
        int rootIndex = map.get(postorder[postEnd-1]);
        TreeNode root = new TreeNode(inorder[rootIndex]);//根节点
        int lenOfLeft = rootIndex - inBegin;
        root.left = findNode(inorder,inBegin,rootIndex, postorder,postBegin,postBegin+lenOfLeft);
        root.right = findNode(inorder, rootIndex+1,inEnd,postorder,postBegin+lenOfLeft,postEnd-1);
        return root;
    }
}

在这里插入图片描述

四、从中序与前序遍历序列构造二叉树(力扣105)

给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。
在这里插入图片描述
思路:
和第三题基本一致,注意参数的细微差别

class Solution {
    Map<Integer,Integer> map;
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        map = new HashMap<>();
        for(int i=0;i<inorder.length;i++){
            map.put(inorder[i],i);
        }
        return findNode(preorder,0,preorder.length,inorder,0,inorder.length);
    }
    public TreeNode findNode(int[] preorder,int preBegin,int preEnd,int[] inorder,int inBegin,int inEnd){
        if(preBegin >= preEnd || inBegin >= inEnd) return null;
        int rootIndex = map.get(preorder[preBegin]);
        TreeNode root = new TreeNode(inorder[rootIndex]);
        int lenOfLeft = rootIndex - inBegin;
        root.left = findNode(preorder,preBegin+1,preBegin+lenOfLeft+1,inorder,inBegin,rootIndex);
        root.right = findNode(preorder,preBegin+lenOfLeft+1,preEnd,inorder,rootIndex+1,inEnd);
        return root;
    }
}

在这里插入图片描述

五、最大二叉树(力扣654)

给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建:

创建一个根节点,其值为 nums 中的最大值。
递归地在最大值 左边 的 子数组前缀上 构建左子树。
递归地在最大值 右边 的 子数组后缀上 构建右子树。
返回 nums 构建的 最大二叉树 。
在这里插入图片描述
思路:
和第三题基本一致,注意参数的细微差别

class Solution {

    public TreeNode constructMaximumBinaryTree(int[] nums) {
        return buildTree(nums,0,nums.length);
    }
    public TreeNode buildTree(int[] nums,int leftIndex,int rightIndex){
        if (rightIndex - leftIndex < 1) {// 没有元素了
            return null;
        }
        if (rightIndex - leftIndex == 1) {// 只有一个元素
            return new TreeNode(nums[leftIndex]);
        }
        int rootIndex = leftIndex;
        int rootValue = nums[rootIndex];

        for(int i =leftIndex;i<rightIndex;i++ ){
            if(nums[i]>rootValue){
                rootValue = nums[i];
                rootIndex = i;
            } 
        }
        TreeNode root = new TreeNode(rootValue);
        root.left=buildTree(nums,leftIndex,rootIndex);
        root.right=buildTree(nums,rootIndex+1,rightIndex);
        return root;
    }
}

在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/104803.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微服务框架 SpringCloud微服务架构 微服务面试篇 54 微服务篇 54.1 SpringCloud常见组件有哪些?

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 微服务面试篇 文章目录微服务框架微服务面试篇54 微服务篇54.1 SpringCloud常见组件有哪些&#xff1f;54 微服务篇 54.1 SpringCloud常见组…

【验证码逆向专栏】某片滑块、点选验证码逆向分析

声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;不提供完整代码&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 本文章未…

30岁了想转行学Python,来得及吗?

是否来得及要看决心有多大&#xff0c;行动力有多强。一般来说&#xff0c;只要目标明确&#xff0c;足够自律&#xff0c;心理强大&#xff0c;做任何事情都是来得及的&#xff0c;当下就是最好的开始。30岁真的不算啥&#xff0c;有人四五十岁才开始奋斗&#xff0c;依然能过…

C语言之内存管理(十七)(转世灵童现世)

上一篇: C语言入门篇之轮回法器&#xff08;十六&#xff09;&#xff08;指针第五卷&#xff09; 逐梦编程&#xff0c;让中华屹立世界之巅。 简单的事情重复做,重复的事情用心做,用心的事情坚持做&#xff1b; 文章目录前言一、内存管理具体介绍1.作用域2.生命周期的定义3.局…

为什么说学人工智能一定要学Python?

有很多人在问博主&#xff0c;为什么人工智能学习要用Python&#xff1f;运行速度慢不好之类的&#xff0c;今天就让博主谈谈自己的感受。 先来说说前景 随着“大数据”“云计算”“人工智能”等等科技的兴起&#xff0c;IT行业在今后三到五年将会迎来一个高速发展期。这也就意…

QT调用python传递图像和二维数组,并接受python返回值(图像)

任务目的&#xff1a; 用QT调用python代码&#xff0c;将QT读取的图像(Mat矩阵)作为参数传入python中&#xff0c;将QT的二维数组作为参数传递给python&#xff0c;python接收QT传入的图像进行计算&#xff0c;将结果返回给QT。 实现过程 1.新建QT项目 说明&#xff1a;QT的…

[Cortex-M3]-5-cache uncache

目录 1 cache的引入 2 cache的工作原理 3 cache使用限制 1 cache的引入 程序运行的流程&#xff08;很简单&#xff09;&#xff1a; 程序编译&#xff1a;存放在flash&#xff1b;程序加载&#xff1a;程序加载到内存&#xff1b;程序运行&#xff1a;指令从内存复制到CP…

【产品人卫朋】自媒体运营的5个阶段,以及增长策略

本篇内容以微信公众号为例讲解自媒体的运营策略。 建立一个快速发展的微信公众号&#xff0c;需要多长时间呢&#xff1f; 有些人在一年内就可以建立一个蓬勃发展的公众号&#xff0c;而其他人则可能需要两年、三年甚至是五年的时间。 在发展的过程中&#xff0c;你的公众号将经…

阿里工程师告诉你,0基础如何自学python进大厂

大概一年前这个朋友就想学习Python了&#xff0c;但因为工作比较忙&#xff0c;而且觉得Python肯定不太好学&#xff0c;所以一直搁置在那里。 宅家学Python 到了今年1月28日也就是大年初三的时候&#xff0c;眼看新冠肺炎疫情不会短时间结束了&#xff0c;全国各地都在严控&…

原型模式

开始原型模式前&#xff0c;我们要知道深拷贝的定义&#xff0c;因为原型模式中的克隆操作核心就是深拷贝。 深拷贝和浅拷贝 下图为浅拷贝(即是编译器的默认版本), 只拷贝了指针, 两个指针同时指向一个内存, 会有危险(a改变时b也改变, 称为别名) , 导致内存泄漏 调用strcpy复…

Qt扫盲-QTreeWidget理论总结

QTreeWidget理论总结1. 简述2. QTreeWidgetItem 简述3. 头标签4. 常用功能5. 槽函数6. 信号1. 简述 QTreeWidget 类是Qt提供了一个标准的树部件&#xff0c;该部件具有经典的基于 Item 的界面&#xff0c;每个Item都是一个 QTreeWidgetItem。这个标准的树控件不需要model/view…

文科女进德国IBM实习做程序媛,我是怎么办到的?

很快我在IBM德国区实习的第一个月就要结束了。 作为一个土生土长的文科生&#xff08;硕士语言学、本科语言学商科&#xff09;&#xff0c;现在竟在欧洲混入跨国科技公司做编程技术类实习生&#xff0c;我自己也挺意外的。 尽管只是一点点微不足道的个人经历&#xff0c;此时…

教你如何优雅的转行Python程序员,一学就会

在实际的工作中&#xff0c;我们经常发现&#xff0c;很多朋友在某一个工作中做了一段时间&#xff0c;发现自己越做越没兴趣&#xff0c;越做越不开心&#xff0c;想跳不敢跳&#xff0c;想辞不敢辞&#xff0c;最后影响了自己的本职工作&#xff0c;陷入两难的窘境。 其实&am…

【Qbot】3.加入内容审核功能

该项目计划长期进行维护更新&#xff0c;欢迎star&#xff1a;https://github.com/zstar1003/Qbot 前言 在ChatGPT上线Q群不久&#xff0c;不少人对其进行了测试&#xff0c;但随着时间的延续&#xff0c;测试话题逐渐走向失控&#xff0c;迫使我不得不紧急暂停。 对同胞素质的…

【Python百日进阶-数据分析】Day134 - plotly饼图:go.pie()实例

文章目录4.2 go.Pie() 的基本饼图4.2.1 基本饼图4.2.2 样式饼图4.2.3 使用 uniformtext 控制文本字体大小4.2.4 控制饼图中的文本方向4.2.5 甜甜圈图4.2.6 从中心拉出扇区4.2.7 子图中的饼图4.2.8 自定义颜色集的子图4.2.9 绘制面积与总计数成比例的图表4.2.10 旭日图4.2.11 Da…

电脑软件、微信多开

因为办公需要在电脑上登录 2 个微信&#xff0c;但是直接双击微信图标只有 1 个登录界面&#xff0c;无法是现实登录 2 个微信。那么怎么才能在 1 个电脑上打开 2 个微信&#xff0c;方法有四种&#xff1a;1、安装&#xff1b;2、Enter&#xff1b;3、连续点击&#xff1b;4、…

『 canvas 特效』一文教你绘制绚丽的星空背景 TS + ES6

介绍 很久没有写关于 canvas 效果的文章了&#xff0c;刚好最近又学到了一个新的特效&#xff0c;使用 canvas 绘制多层次动态星空背景&#xff0c;今天就分享给大家。首先我们依旧来看一下最终实现的效果&#xff0c;如图所示&#xff1a; 由于录制 GIF 造成失帧&#xff0c;…

实战三十三:STAMP算法实现商品推荐实战 代码+数据

1.案例知识点 推荐系统任务描述:通过用户的历史行为(比如浏览记录、购买记录等等)准确的预测出用户未来的行为;好的推荐系统不仅如此,而且能够拓展用户的视野,帮助他们发现可能感兴趣的却不容易发现的item;同时将埋没在长尾中的好商品推荐给可能感兴趣的用户。STAMP推荐…

记录Win7系统下的node版本升级过程及后续项目启动所遇问题

目录 Windows7系统如何“安装”高版本Node 后续项目运行启动时遇到的问题 Bug &#xff1a; 背景 &#xff1a; 银行内网开发&#xff0c;接到一个新的项目开发&#xff0c;但前提因为开发所使用的云桌面更换了&#xff0c;由原来的Windows10系统降到了现在的Windows7系统&am…

【自媒体必备】AI文字转语音,支持多种人声选择,在线生成一键导出【电脑永久版】

AI文字转语音&#xff0c;支持多种人声选择&#xff0c;在线生成一键导出 软件是电脑版安装版本&#xff0c;大家根据自己安软件的习惯进行安装即可&#xff0c;安装后打开软件即可&#xff0c;且完全免费。语音选择方面就有晓晓、云扬、云希等等常用选择。点击后面的播放按钮…