算法训练营 day17 二叉树 平衡二叉树 二叉树的所以路径 左叶子之和

news2024/11/16 4:51:53

算法训练营 day17 二叉树 平衡二叉树 二叉树的所以路径 左叶子之和

平衡二叉树

110. 平衡二叉树 - 力扣(LeetCode)

给定一个二叉树,判断它是否是高度平衡的二叉树。

本题中,一棵高度平衡二叉树定义为:

一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。

递归法

  1. 明确递归函数的参数和返回值

参数:当前传入节点。
返回值:以当前传入节点为根节点的树的高度。

  1. 明确终止条件

递归的过程中依然是遇到空节点了为终止,返回0,表示当前节点为根节点的树高度为0.

  1. 明确单层递归的逻辑

如何判断以当前传入节点为根节点的二叉树是否是平衡二叉树呢?当然是其左子树高度和其右子树高度的差值。

分别求出其左右子树的高度,然后如果差值小于等于1,则返回当前二叉树的高度,否则返回-1,表示已经不是二叉平衡树了。

class Solution {
    public boolean isBalanced(TreeNode root) {
        return getHeight(root)!=-1;
    }

    private static int getHeight(TreeNode root) {
        if (root==null) return 0;

        int leftHeight = getHeight(root.left);
        if (leftHeight==-1) return -1;
        int rightHeight = getHeight(root.right);
        if (rightHeight==-1) return -1;

        int result;
        if (Math.abs(leftHeight-rightHeight)>1) result=-1;
        else result = Math.max(rightHeight,leftHeight)+1;
        return result;
    }
}

迭代法

class Solution {
    public boolean isBalanced(TreeNode root) {
         if (root==null) return true;
        Stack<TreeNode> st = new Stack<>();
        TreeNode node;
        st.push(root);
        while (!st.isEmpty()){
            node = st.pop();
            if (Math.abs(getHeight(node.left)-getHeight(node.right))>1)return false;

            if (node.left!=null)st.push(node.left);
            if (node.right!=null)st.push(node.right);
        }
        return true;
    }

    private static int getHeight(TreeNode root) {
        if (root==null) return 0;
        Stack<TreeNode> st = new Stack<>();
        TreeNode node;
        st.push(root);
        int depth = 0;
        int result = 0;
        while (!st.isEmpty()){
            node = st.pop();
            if (node!=null){
                st.push(node);
                st.push(null);
                depth++;
                if (node.left!=null)st.push(node.left);
                if (node.right!=null)st.push(node.right);
            }else {
                st.pop();
                depth--;

            }
            result = result>depth? result : depth;

        }
        return result;
    }
}

二叉树的所以路径

257. 二叉树的所有路径 - 力扣(LeetCode)

给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。

叶子节点 是指没有子节点的节点。

在这里插入图片描述

递归法

  1. 递归函数函数参数以及返回值

要传入根节点,记录每一条路径的path,和存放结果集的result,这里递归不需要返回值.

  1. 确定递归终止条件

当 cur不为空,其左右孩子都为空的时候,就找到叶子节点。

  1. 确定单层递归逻辑

因为是前序遍历,需要先处理中间节点,中间节点就是我们要记录路径上的节点,先放进path中。

class Solution {
    public List<String> binaryTreePaths(TreeNode root) {
        List<String> result = new ArrayList<>();
        if (root==null){
            return result;
        }
        List<Integer> path = new ArrayList<>();
        traversal(root,path,result);
        return  result;
    }
    private static void traversal(TreeNode root, List<Integer> paths, List<String> res) {
        paths.add(root.val);
        if (root.left==null&&root.right==null){
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < paths.size()-1; i++) {
                sb.append(paths.get(i)).append("->");
            }
            sb.append(paths.get(paths.size()-1));
            res.add(sb.toString());
        }
        if (root.left!=null){
            traversal(root.left,paths,res);
            paths.remove(paths.size()-1);
        }
        if (root.right!=null){
            traversal(root.right,paths,res);
            paths.remove(paths.size()-1);
        }
    }
}

迭代法

class Solution {
    public List<String> binaryTreePaths(TreeNode root) {
        List<String> result = new ArrayList<>();
        if (root==null) return  result;
        Stack<TreeNode> st = new Stack<>();
        Stack<String> paths = new Stack<>();
        st.push(root);
        paths.push(String.valueOf(root.val));
        while (!st.isEmpty()){
            TreeNode node = st.pop();
            String path = paths.pop();
            if (node.left==null&&node.right==null){
                result.add(path);
            }

            if (node.left!=null){
                st.push(node.left);
                paths.push(path+"->"+String.valueOf(node.left.val));
            }
            if (node.right!=null){
                st.push(node.right);
                paths.push(path+"->"+String.valueOf(node.right.val));
            }
        }
        return result;
    }
}

左叶子之和

404. 左叶子之和 - 力扣(LeetCode)

给定二叉树的根节点 root ,返回所有左叶子之和

在这里插入图片描述

递归法

  1. 确定递归函数的参数和返回值

判断一个树的左叶子节点之和,那么一定要传入树的根节点,递归函数的返回值为数值之和,所以为int

使用题目中给出的函数就可以了。

  1. 确定终止条件

如果遍历到空节点,那么左叶子值一定是0,注意,只有当前遍历的节点是父节点,才能判断其子节点是不是左叶子。 所以如果当前遍历的节点是叶子节点,那其左叶子也必定是0

  1. 确定单层递归的逻辑

当遇到左叶子节点的时候,记录数值,然后通过递归求取左子树左叶子之和,和 右子树左叶子之和,相加便是整个树的左叶子之和。

class Solution {
    public int sumOfLeftLeaves(TreeNode root) {
        if (root==null) return 0;
        if (root.left==null&&root.right==null) return 0;
        int leftheight = sumOfLeftLeaves(root.left);
        if (root.left!=null&&root.left.left==null&&root.left.right==null){
            leftheight = root.left.val;
        }
        int rightheight = sumOfLeftLeaves(root.right);
        int sum  = leftheight+rightheight;
        return sum;
    }
}

迭代法

class Solution {
    public int sumOfLeftLeaves(TreeNode root) {
        if (root==null) return 0;
        int sum = 0;
        Stack<TreeNode> st = new Stack<>();
        TreeNode node;
        st.push(root);
        while (!st.isEmpty()){
            node = st.pop();
            if (node.left != null && node.left.left == null && node.left.right == null) {
                sum += node.left.val;
            }
            if (node.left!=null) st.push(node.left);
            if (node.right!=null) st.push(node.right);
        }
        return  sum;
}

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

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

相关文章

osg fbo(五) 通过shader计算纹理坐标并采样

在前边几节&#xff0c;纹理坐标数组是在生成geometry前指定的。 这里在shader里计算&#xff0c; 一&#xff0c;注释掉geometry中的纹理坐标 //osg::ref_ptr<osg::Vec2Array> texCoord new osg::Vec2Array; //texCoord->push_back(osg::Vec2(0.0, 0.0)); //texCoo…

1.13UART串口实验

UART总线&#xff1a; 异步全双工串行总线。用于芯片与外设之间的通信 UART通信协议&#xff1a; 空闲状态处于高电平 起始位&#xff1a;串口通信的起始标志 数据位&#xff1a;传输数据时先从低位开始传输&#xff0c;再传输高位 奇偶校验位&#xff1a; 奇校验&#x…

MacOS 系统中如何使用EF Core进行数据迁移?

原有 笔者最近在使用MacOS系统做asp.net core mvc项目开发。可是一直习惯了使用宇宙最强大的vs2019工具。突然换到苹果系统就感觉什么都是问题了。现在我将遇到该问题的解决方案做下记录&#xff0c;方便自己也是方便别的同学快速的解决问题。 发现有坑 其实最开始我也是翻阅…

RocketMQ 存储优化技术 解析——图解、源码级解析

&#x1f34a; Java学习&#xff1a;Java从入门到精通总结 &#x1f34a; 深入浅出RocketMQ设计思想&#xff1a;深入浅出RocketMQ设计思想 &#x1f34a; 绝对不一样的职场干货&#xff1a;大厂最佳实践经验指南 &#x1f4c6; 最近更新&#xff1a;2023年1月13日 &#x…

Django 后端没有接收到前端anxios的 post 内容

前端使用 vue 无论怎样 post 后端都说没有接收到值&#xff0c;&#xff08;后端接口正确&#xff09; 寻找原因&#xff1a; 1、前端查看自己的请求类型 Content-Type:application/json 我们的请求是这样的&#xff1a; axios({method:post,url:/video/upload,data:{"…

RedHat6配置本地yum源(最新超详细过程)

一、环境准备 挂载iso的镜像文件在CD/DVD驱动器上&#xff0c;需要确保&#xff0c;已连接已打开&#xff0c;且CD/DVD上的介质符合当前操作系统的版本。 挂载本地光盘到系统 在“编辑设置”——>“硬件”——>“CD/DVD驱动器”里指定操作系统的ISO镜像文件 光驱挂载…

web性能测试:Lighthouse测试实践

一工具简介 Lighthouse是Google开源的一个自动化工具&#xff0c;它可以搜集多个Web网页性能指标&#xff0c;分析Web应用的性能并生成报告&#xff0c;为开发人员进行性能优化提供了参考方向。1工作原理•Driver&#xff08;驱动&#xff09;—— 通过 Chrome Debugging Proto…

力扣sql基础篇(六)

力扣sql基础篇(六) 1 学生参加各科测试的次数 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 a 输入示例 b 输出示例 1.2 示例sql语句 # 无论考没考试都要该科目这栏且无连接字段,就可以考虑笛卡尔积了 SELECT s.student_id,s.student_name,s.subject_name,IFNULL…

【软件STM32cubeIDE下STM32F4xx使用DMA+定时器推PWM+灯带WS2812-进阶-综合汇总(讲解移植相关)】

2TOC &#xff08;1&#xff09;前言 做灯带ws2812其实有一段时间了&#xff0c;中间遇到很多问题&#xff0c;从开始的学习&#xff0c;到后来慢慢熟悉&#xff0c;再到后来尝试点很多灯带&#xff0c;做过非常多的实验了&#xff0c;自己新建工程&#xff0c;几乎尝试过很多…

【Git】GitHub 操作

6、GitHub 操作 GitHub 网址&#xff1a;https://github.com/ Ps:全球最大同性交友网站&#xff0c;技术宅男的天堂&#xff0c;新世界的大门&#xff0c;你还在等什么? 账号姓名验证邮箱atguiguyueyue岳不群atguiguyueyuealiyun.comatguigulinghuchong令狐冲atguigulinghu…

72、PaletteNeRF: Palette-based Appearance Editing of Neural Radiance Fields

简介 官网:https://palettenerf.github.io/ 以(a)多视图照片为训练输入&#xff0c;重建NeRF并将其外观分解为一组(b)基于3D调色板的色基&#xff0c;实现了©直观和逼真的场景重新着色&#xff0c;在任意视图之间具有3D一致性&#xff0c;如(d)所示&#xff0c;该方法支…

人工智能与Python的渊源

人工智能起源与发展 文章目录人工智能起源与发展前言一、达特茅斯会议与人工智能起源二、人工智能发展的高峰与低谷Python与人工智能构建Python人工智能编程环境1.Python版本2.Anaconda编程环境数据处理常用算法2.1傅里叶变换2.1.1傅里叶分析的由来2.1.2傅里叶变换原理及应用傅…

MODBUS协议下,组态王与S7-1200能否建立无线通讯?

MODBUS协议下&#xff0c;想要组态王与S7-1200之间的无线通讯其实很容易。可采用了西门子PLC专用无线通讯终端DTD434MC&#xff0c;作为实现无线通讯的硬件设备&#xff0c;使用简单方便&#xff0c;不必深入理解 MODBUS 协议细节&#xff0c;无需更改网络参数直接替换有线连接…

波士顿房价预测—随机梯度下降法优化

根据我上一篇关于波士顿房价预测一文可以知道&#xff0c;如果使用梯度下降法&#xff0c;需要将所有的样本对梯度的贡献取平均&#xff0c;根据梯度更新参数。 但是面对海量样本的数据集&#xff0c;如果每次计算都使用全部的样本来计算损失函数和梯度&#xff0c;性能会很差&…

如何创建商用照明 App SDK 应用?

商用照明 App SDK 是专为照明行业的物联网应用提供的移动端开发工具。通过商用照明 SDK&#xff0c;大家可以形成完整的商用照明物联网控制系统&#xff0c;多协议兼容&#xff0c;完美满足绿色建筑的设备管理及能源管理要求。 什么是涂鸦商用照明&#xff1f; 涂鸦商用照明解…

python基础语法(1)

专栏&#xff1a;python 每日一句&#xff1a;人生&#xff0c;无非只有三天&#xff0c;昨天&#xff0c;今天&#xff0c;明天。昨天很长&#xff0c;说不清有多少天&#xff0c;但不管有多少天&#xff0c;不管是受到挫折&#xff0c;还是取得辉煌&#xff0c;都只能代表过去…

Feign

文章目录Http客户端Feign1、Feign替代RestTemplate1.1、RestTemplate方式调用存在的问题1.2、Feign介绍1.3、定义和使用Feign客户端2、Feign的自定义配置2.1、修改日志级别3、Feign的性能优化3.1、Feign的性能优化-连接池配置4、Feign的最佳实践4.1、方式一&#xff08;继承&am…

TypeScript类型 : any,unknown

1.any类 在某些情况下&#xff0c;我们确实无法确定一个变量的类型&#xff0c;并且可能它会发生一些变化&#xff0c;这个时候我们可以使用any类型&#xff08;类似 于Dart语言中的dynamic类型&#xff09;。 any类型有点像一种讨巧的TypeScript手段&#xff1a; 1.我们可以…

【23届秋招总结】本科小学弟成功签约滴滴后端开发offer

大家好&#xff01;我是路飞&#xff0c;最近工作太忙啦&#xff0c;断更很久&#xff0c;今天给大家分享一位本科23届小学弟的秋招历程&#xff5e; 在今年整体上就业困难&#xff0c;各大公司校招HC收缩的情况下&#xff0c;这位小学弟也历经坎坷成功拿到了滴滴后端开发岗位…

【安卓学习笔记】安卓的事件处理

安卓提供了两种方式的事件处理&#xff1a;基于回调的事件处理和基于监听的事件处理。 基于监听的事件处理 基于监听的事件处理一般包含三个要素&#xff0c;分别是&#xff1a; Event Source&#xff08;事件源&#xff09;&#xff1a;事件发生的场所&#xff0c;通常是各个…