代码随想录第十七天| ● 110.平衡二叉树 ● 257. 二叉树的所有路径 ● 404.左叶子之和

文章目录

  • 110.平衡二叉树
    • 思路-递归:
      • 代码:
    • 思路二-迭代
  • 257. 二叉树的所有路径
      • 思路一:普通递归
    • 思路二:递归优化
    • 思路三:迭代法(没细看)
  • 404.左叶子之和
    • 思路-递归

110.平衡二叉树

在这里插入图片描述

思路-递归:

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

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

那么如何标记左右子树是否差值大于1呢?

如果当前传入节点为根节点的二叉树已经不是二叉平衡树了,还返回高度的话就没有意义了。

所以如果已经不是二叉平衡树了,可以返回-1 来标记已经不符合平衡树的规则了。

代码如下:

// -1 表示已经不是平衡二叉树了,否则返回值是以该节点为根节点树的高度
int getHeight(TreeNode* node)
  1. 明确终止条件

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

代码如下:

if (node == NULL) {
    return 0;
}
  1. 明确单层递归的逻辑

如何判断以当前传入节点为根节点的二叉树是否是平衡二叉树呢?当然是其左子树高度和其右子树高度的差值。
分别求出其左右子树的高度,然后如果差值小于等于1,则返回当前二叉树的高度,否则返回-1,表示已经不是二叉平衡树了。

代码:

///递归-后序遍历获得高度
class Solution {
    public boolean isBalanced(TreeNode root) {
        return getheight(root)==-1?false:true;
        
    }
    public int getheight(TreeNode root){//返回高度差
        if(root==null)return 0;
        int left=0,right=0;
        left=getheight(root.left);
        if(left==-1){
            return -1;
        }
        right=getheight(root.right);
        if(right==-1){
            return -1;
        }
        return Math.abs(left-right)>1?-1:Math.max(left,right)+1;
    }
}

思路二-迭代

depth代表当前迭代节点的高度,往下走就加1,向上回溯就-1 ,result代表最大深度,每次迭代跟depth比较然后更新

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public boolean isBalanced(TreeNode root) {
        Stack<TreeNode> stack=new Stack<>();
        if(root!=null){
            stack.push(root);
        }
        while(!stack.isEmpty()){
            TreeNode node = stack.pop();//中
            if(Math.abs(getheight(node.left)-getheight(node.right))>1){
                return false;
            }
            if(node.right!=null){//右
                stack.push(node.right);
            }
            if(node.left!=null){//中
                stack.push(node.left);
            }
        }
        return true;
    }
    public int getheight(TreeNode root){//返回高度
        Stack<TreeNode> stack=new Stack<>();
        if(root!=null){
            stack.push(root);
        }
        int deep=0;
        int result=0;
        while(!stack.isEmpty()){
            TreeNode node = stack.peek();
            if(node!=null){
                stack.pop();
                stack.push(node);
                stack.push(null);//中
                deep++;
                if(node.right!=null)stack.push(node.right);//右
                if(node.left!=null)stack.push(node.left);//左
            }else{
                stack.pop();
                node=stack.pop();
                deep--;
            }
            result=result>deep?result:deep;
        }
        return result;
    }
}

257. 二叉树的所有路径

在这里插入图片描述

思路一:普通递归

path储存路径节点,res储存所有路径
因为每次递归会修改path数组list,所以递归时要进行回溯

class Solution {
    public List<String> binaryTreePaths(TreeNode root) {
        List<String> res = new ArrayList<>();
        if(root==null){
            return res;
        }
        List<Integer> path = new ArrayList<>();
        traversal(root,path,res);
        return res;
    }
    private void traversal(TreeNode node,List<Integer>paths,List<String> res){
        // 中,中为什么写在这里,因为最后一个节点也要加入到path中
        paths.add(node.val);
        // 找到叶子结点了,储存路径
        // 中
        if(node.left==null&&node.right==null){
            // StringBuilder用来拼接字符串,速度更快
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < paths.size() - 1; i++) {
                sb.append(paths.get(i)).append("->");
            }// 把path储存的数据逐一链接为路径
            // 记录做后一个节点
            sb.append(paths.get(paths.size()-1));
            // 收集一个路径
            res.add(sb.toString());
            return;
        }
        // 左
        if(node.left!=null){
        // 有递归就有回溯
            traversal(node.left,paths,res);// 递归
            paths.remove(paths.size() - 1);// 回溯
        }
        if(node.right!=null){
        // 有递归就有回溯
            traversal(node.right,paths,res);// 递归
            paths.remove(paths.size() - 1);// 回溯
        }
    }
}

思路二:递归优化

递归时把 tmp作为函数参数就是可以的,因为并没有改变String tmp的数值,执行完递归函数之后,tmp依然是之前的计算的数值(相当于回溯了)

class Solution {
    List<String> res=new ArrayList<>();
    public List<String> binaryTreePaths(TreeNode root) {
        deel(root,"");
        return res;
    }
    public void deal(TreeNode node,String s){
        if(node == null)return;
        if(node.left==null&&node.right==null){
            result.add(new StringBuilder(s).append(node.val).toString());
            return;
        
        }
        String tmp=new StringBuilder(s).append(node.val).append("->").toString();
        deal(node.left,tmp);
        deal(node.right,tmp);
    }
}

思路三:迭代法(没细看)

Java 可以直接定义一个成员变量为object的栈,这个栈可以放 TreeNode,可以放 String,这样就不需要搞两个栈,都放在一个栈里即可。
力扣题解+图解

class Solution {
    /**
     * 迭代法
     */
    public List<String> binaryTreePaths(TreeNode root) {
        List<String> result = new ArrayList<>();
        if (root == null)
            return result;
        Stack<Object> stack = new Stack<>();
        // 节点和路径同时入栈
        stack.push(root);
        stack.push(root.val + "");
        while (!stack.isEmpty()) {
            // 节点和路径同时出栈
            String path = (String) stack.pop();
            TreeNode node = (TreeNode) stack.pop();
            // 若找到叶子节点
            if (node.left == null && node.right == null) {
                result.add(path);
            }
            //右子节点不为空
            if (node.right != null) {
                stack.push(node.right);
                stack.push(path + "->" + node.right.val);
            }
            //左子节点不为空
            if (node.left != null) {
                stack.push(node.left);
                stack.push(path + "->" + node.left.val);
            }
        }
        return result;
    }
}

404.左叶子之和

这道题目要求左叶子之和,其实是比较绕的,因为不能判断本节点是不是左叶子节点。

此时就要通过节点的父节点来判断其左孩子是不是左叶子了。

平时我们解二叉树的题目时,已经习惯了通过节点的左右孩子判断本节点的属性,而本题我们要通过节点的父节点判断本节点的属性。
在这里插入图片描述

思路-递归

class Solution {
    public int sumOfLeftLeaves(TreeNode root) {
        if (root == null) return 0;
        int midValue = 0;
        // sumOfLeftLeaves(root.left)
        if(root.left!=null&&root.left.right==null&&root.left.left==null){
            midValue=root.left.val;
        }
        int leftValue = sumOfLeftLeaves(root.left);    // 左
        int rightValue = sumOfLeftLeaves(root.right);  // 右

        int sum = midValue + leftValue + rightValue;  // 中
        return sum;
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

解决WinForms跨线程操作控件的问题

解决WinForms跨线程操作控件的问题 介绍 在构建Windows窗体应用程序时&#xff0c;我们通常会遇到需要从非UI线程更新UI元素的场景。由于WinForms控件并不是线程安全的&#xff0c;直接这样做会抛出一个异常&#xff1a;“控件’control name’是从其他线程创建的&#xff0c;…

Oracle DG环境下的秘钥管理

今天有朋友问到1&#xff09;DG环境下的秘钥管理需要注意什么&#xff0c;2&#xff09;秘钥管理对DG的日志同步有影响吗&#xff1f; 对于2&#xff09;的回答是明确的&#xff0c;没有影响。秘钥的管理和DG的redo log shipping完全是两套机制。在最新版的Oracle Key Vault常…

基于YOLOv7算法的高精度实时五类动物目标检测系统(PyTorch+Pyside6+YOLOv7)

摘要&#xff1a;基于YOLOv7算法的高精度实时五类动物目标检测系统可用于日常生活中检测与定位狼、鹿、猪、兔和浣熊&#xff0c;此系统可完成对输入图片、视频、文件夹以及摄像头方式的目标检测与识别&#xff0c;同时本系统还支持检测结果可视化与导出。本系统采用YOLOv7目标…

多数据源 dynamic-datasource 模块使用

在项目中引入dynamic-datasource该modul 在application.yml中添加 dynamic:datasource:slave1: driver-class-name: oracle.jdbc.OracleDriverurl: jdbc:oracle:thin:XXX:orcl_tjhusername: XXpassword: XXvalidation-query: SELECT 1 FROM DUALslave2: driver-class-name: co…

广东建筑模板厂家批发-建筑木模板市场供应

近年来&#xff0c;随着建筑行业的快速发展&#xff0c;建筑模板作为一种不可或缺的建筑材料&#xff0c;备受关注。广东作为中国建筑业的重要发展地区之一&#xff0c;其建筑模板市场也日渐繁荣。在这个市场中&#xff0c;建筑模板厂家能强优品木业成为了备受青睐的选择&#…

操作符详解(上)

目录 操作符的分类 二进制和进制转换 2进制转10进制 10进制转2进制数字 2进制转8进制 2进制转16进制 原码、反码、补码 移位操作符 左移操作符 右移操作符 位操作符&#xff1a;&、|、^、~ 单目操作符 逗号表达式 操作符的分类 • 算术操作符&#xff1a; …

大数据学习之Flink,了解Flink的多种部署模式

目录 一、部署模式 1. 部署模式分类&#xff1a; 1.1 会话模式&#xff08;Session Mode&#xff09;&#xff1a; 优点&#xff1a; 缺点&#xff1a; 1.2 单作业模式&#xff08;Per-Job Mode&#xff09;&#xff1a; 优点&#xff1a; ​ 缺点&#xff1a; ​ 1.3…

Kubernetes/k8s之安全机制:

k8s当中的安全机制 核心是分布式集群管理工具&#xff0c;容器编排&#xff0c;安全机制核心是:API SERVER作为整个集群内部通信的中介&#xff0c;也是外部控制的入口&#xff0c;所有的安全机制都是围绕api server开设计的。 请求api资源 1、认证 2、鉴权 3、准入机制 三…

【技术预研】StarRocks官方文档浅析(2)

背景说明 基于starRocks官方文档&#xff0c;对其内容进行一定解析&#xff0c;方便大家理解和使用。 若无特殊标注&#xff0c;startRocks版本是3.2。 下面的章节和官方文档保持一致。 参考文档 产品简介 | StarRocks StarRocks StarRocks 是一款高性能分析型数据仓库&…

Conda python管理环境environments 四 从入门到精通

Conda系列&#xff1a; 翻译: Anaconda 与 miniconda的区别Miniconda介绍以及安装Conda python运行的包和环境管理 入门Conda python管理环境environments 一 从入门到精通Conda python管理环境environments 二 从入门到精通Conda python管理环境environments 三 从入门到精通…

CSS复合选择器和CSS层叠性、继承性有哪些内容?

知识引入 1.CSS复合选择器 书写CSS样式表时&#xff0c;可以使用CSS基础选择器选中目标元素。但是在实际网站开发中&#xff0c;一个网页中可能包含成千上万的元素&#xff0c;如果仅使用CSS基础选择器&#xff0c;是远远不够的。为此&#xff0c;CSS提供了几种复合选择器&am…

【论文笔记】Learning Deconvolution Network for Semantic Segmentation

重要说明&#xff1a;严格来说&#xff0c;论文所指的反卷积并不是真正的 deconvolution network 。 关于 deconvolution network 的详细介绍&#xff0c;请参考另一篇博客&#xff1a;什么是Deconvolutional Network&#xff1f; 一、参考资料 Learning Deconvolution Netwo…

命令行启动Android Studio模拟器

1、sdk路径查看&#xff08;打开Android Studio&#xff09; 以上前提是安装的Android Studio并添加了模拟器&#xff01;&#xff01;&#xff01; 2、复制路径在终端进入到 cd /Users/duxi/Library/Android/sdk目录&#xff08;命令行启动不用打开Android Studio就能运行模拟…

深入理解ZooKeeper分布式锁

第1章&#xff1a;引言 分布式系统&#xff0c;简单来说&#xff0c;就是由多台计算机通过网络相连&#xff0c;共同完成任务的系统。想象一下&#xff0c;咱们平时上网浏览网页、看视频&#xff0c;背后其实都是一大堆服务器在协同工作。这些服务器之间需要协调一致&#xff…

微信小程序元素/文字在横向和纵向实现居中对齐、两端对齐、左右对齐、上下对齐

元素对齐往往是新学者的一大困惑点&#xff0c;在此总结常用的各种元素和文字对齐方式以供参考&#xff1a; 初始显示 .wxml <view style"width: 100%;height: 500rpx; background-color: lightgray;"><view style"width: 200rpx;height:100rpx;bac…

navicat连接postgresql、人大金仓等数据库报错

navicat连接postgresql、人大金仓数据库报错问题是一个偶现的问题&#xff0c;需要我们特别关注&#xff1a; 1、客户端连接人大金仓数据库 这里注意&#xff1a;navicat连接postgresql、人大金仓数据库时均选择postgresql类型&#xff0c;因为人大金仓数据库底层和psql数据库…

Github 无法正常访问?一招解决

查询IP网址: https://ip.chinaz.com/ 主页如下&#xff1a; 分别查询以下三个网址的IP&#xff1a; github.com github.global.ssl.fastly.net assets-cdn.github.com 修改 hosts 文件&#xff1a; 将 /etc/hosts 复制到 home 下 sudo cp /etc/hosts ./ gedit hosts 在底下…

【大根堆】【C++算法】871 最低加油次数

作者推荐 【动态规划】【map】【C算法】1289. 下降路径最小和 II 本文涉及知识点 大根堆 优先队列 LeetCode:871最低加油次数 汽车从起点出发驶向目的地&#xff0c;该目的地位于出发位置东面 target 英里处。 沿途有加油站&#xff0c;用数组 stations 表示。其中 statio…

洛谷P5735 【深基7.例1】距离函数(C语言)

首先&#xff0c;三角形周长为 其次(x1,x2)和 &#xff08;y1,y2&#xff09;的距离 然后就可以为所欲为 #include <stdio.h> #include <math.h>double distance(double a1, double b1, double a2, double b2) {return sqrt((a1 - a2) * (a1 - a2) (b1 - b2) * …

code server安装使用教程

1. 安装 1.1. 下载code-server安装包 类似这种文件&#xff1a;code-server-3.10.2-linux-amd64.tar.gz 解压&#xff1a;tar -xvf code-server-3.10.2-linux-amd64.tar.gz 1.2 &#xff08;可选&#xff09;建立软连接 ln -s path/to/code-server-3.10.2-linux-amd64/bin…
最新文章