代码随想录刷题笔记-Day14

 1. 对称二叉树

101. 对称二叉树icon-default.png?t=N7T8https://leetcode.cn/problems/symmetric-tree/给你一个二叉树的根节点 root , 检查它是否轴对称。

示例 1:

输入:root = [1,2,2,3,4,4,3]
输出:true

示例 2:

输入:root = [1,2,2,null,3,null,3]
输出:false

解题思路

判断一个二叉树是否对称,也就是需要同时遍历左右子树,并且比较对称位置的值。

先看以递归的办法进行遍历的时候:

首先要确定递归终止条件。当left当前遍历的节点和right当前遍历的节点都为null的时候就是true。只有一个为null的时候就是false,当都不为true的时候,如果值不一样也为false。

第二个是递归的传参,迭代的传参就是left和right的下一个节点。

最后要确定的是返回值,把左右子树的返回值做一个and操作。

迭代的办法进行遍历的时候:

左右都使用一个栈,

左右子树都需要进行迭代遍历,为了解决不为满二叉树的时候无法感知到取出的节点位于层次的具体位置,我们需要把整个二叉树当作满二叉树。也就是说不论节点的左右子节点是否为null都进行入栈。当取出来为null的时候就跳过。

当取出来的都为null的时候,continue;当只有一个为null或者val不一样的时候返回false;当val一样的时候,就把子节点进行入栈。

使用一个双端队列,两端就是两个栈。

代码

递归法

class Solution {
    public boolean isSymmetric(TreeNode root) {
        if (root == null)
            return true;
        return compare(root.left, root.right);
    }

    public boolean compare(TreeNode left, TreeNode right) {
        if (left == null && right == null)
            return true;
        else if ((left != null && right == null) || (left == null && right != null))
            return false;
        else if (left.val != right.val)
            return false;
        return compare(left.left, right.right) && compare(left.right, right.left);
    }
}

迭代法

   public boolean isSymmetric(TreeNode root) {
        Deque<TreeNode> queue = new LinkedList<>();
        queue.addFirst(root.left);
        queue.addLast(root.right);
        while (!queue.isEmpty()) {
            TreeNode left = queue.pollFirst();
            TreeNode right = queue.pollLast();
            if (left == null && right == null)
                continue;
            else if (left == null || right == null || left.val != right.val)
                return false;
            queue.addFirst(left.left);
            queue.addLast(right.right);
            queue.addFirst(left.right);
            queue.addLast(right.left);
        }

        return true;
    }

2. 二叉树的最大深度

104. 二叉树的最大深度icon-default.png?t=N7T8https://leetcode.cn/problems/maximum-depth-of-binary-tree/

给定一个二叉树 root ,返回其最大深度。

二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。

解题思路

最大深度就是二叉树的层高。

第一个想法就是层级遍历的次数。也就是迭代法。

然后又考虑递归实现的可能性:

返回值为当前节点的层高。

终止递归的情况是当前节点为null,返回0;

每一层的处理就是返回左右子树的最高层高的最大值+1;

代码

递归

class Solution {
    public int maxDepth(TreeNode root) {
        if (root == null)
            return 0;
        return 1 + Math.max(maxDepth(root.left), maxDepth(root.right));
    }
}

迭代

class Solution {
    public int maxDepth(TreeNode root) {
        Deque<TreeNode> queue = new LinkedList<>();
        int high = 0;
        if (root == null)
            return high;
        queue.add(root);
        while (!queue.isEmpty()) {
            int len = queue.size();
            while (len > 0) {
                TreeNode node = queue.poll();
                if (node.left != null)
                    queue.add(node.left);
                if (node.right != null)
                    queue.add(node.right);
                len--;
            }

            high++;
        }
        return high;
    }
}

3. 二叉树的最小深度

111. 二叉树的最小深度icon-default.png?t=N7T8https://leetcode.cn/problems/minimum-depth-of-binary-tree/

给定一个二叉树,找出其最小深度。

最小深度是从根节点到最近叶子节点的最短路径上的节点数量。

说明:叶子节点是指没有子节点的节点。

解题思路

首先是递归法的思考:

结束条件是左右节点都为null,返回1。所以加入递归前先判断是否为null。

返回值是子树的最小高度+1。

迭代法:

在层次遍历记录深度的同时,当一个节点没有子节点的时候,说明这个节点为叶子节点,直接返回当前深度;

代码

递归

class Solution {
	public int minDepth(TreeNode root) {
		if (root == null)
			return 0;
		if (root.left == null && root.right != null) {
			return 1 + minDepth(root.right);
		}
		if (root.left != null && root.right == null) {
			return 1 + minDepth(root.left);
		}
		return Math.min(minDepth(root.left), minDepth(root.right)) + 1;
	}
}

迭代法

class Solution {
    public int minDepth(TreeNode root) {
        if (root == null)
            return 0;
        Deque<TreeNode> queue = new LinkedList<>();
        int deepth = 0;
        queue.add(root);
        while (!queue.isEmpty()) {
            int len = queue.size();
            while (len > 0) {
                TreeNode node = queue.poll();
                if (node.left == null && node.right == null) {
                    return deepth + 1;
                }
                if (node.left != null) {
                    queue.add(node.left);
                }
                if (node.right != null) {
                    queue.add(node.right);
                }
                len--;
            }
            deepth++;
        }
        return deepth;

    }
}

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

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

相关文章

深度解析指针与数组:探索内存管理的艺术

目录 1.数组名的理解 sizeof(数组名)&#xff0c;sizef中单独放数组名&#xff0c;这里的数组名表示整个数组&#xff0c;计算的是整个数组的大小&#xff0c;单位是字节 &数组名&#xff0c;这里的数组名表示整个数组&#xff0c;取出的是整个数组的地址 (整个数组的地…

【Java程序设计】【C00179】基于SSM的电影在线购票管理系统(论文+PPT)

基于SSM的电影在线购票管理系统&#xff08;论文PPT&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于ssm的电影在线购票管理系统 本系统分为前台用户和后台管理员2个功能模块。 前台用户&#xff1a;当游客打开系统的网址后&#xff0c;首先看到…

AR眼镜_ar智能眼镜显示方案|光学方案

AR眼镜是一种智能眼镜&#xff0c;能够将虚拟现实和现实世界相结合&#xff0c;使人们能够在日常生活中体验和参与虚拟现实。然而&#xff0c;AR智能眼镜的制造成本高&#xff0c;开发周期长。要实现AR眼镜的各项功能&#xff0c;需要良好的硬件条件&#xff0c;而AR智能眼镜的…

Mac忘记本机MySql密码怎么办?

Mac忘记本机MySql怎么办&#xff1f; 1.打开系统偏好设置 2.打开Mysql 3.停止服务 4.直接初始化服务上图有一个初始化数据库 5.输入8位密码确认 6.重启服务

如何使用docker compose安装APITable并远程访问登录界面

文章目录 前言1. 部署APITable2. cpolar的安装和注册3. 配置APITable公网访问地址4. 固定APITable公网地址 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的 人工智能学习网站&#xff0c; 通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。 …

Java RC4加密算法

一、RC4加密算法 在密码学中&#xff0c;RC4&#xff08;来自Rivest Cipher 4的缩写&#xff09;是一种流加密算法&#xff0c;密钥长度可变。它加解密使用相同的密钥&#xff0c;因此也属于对称加密算法。 百度百科 - RC4&#xff1a;https://baike.baidu.com/item/RC4/34545…

DS:经典算法OJ题(1)

创作不易&#xff0c;友友们给个三连呗&#xff01;&#xff01; 本文为经典算法OJ题练习&#xff0c;大部分题型都有多种思路&#xff0c;每种思路的解法博主都试过了&#xff08;去网站那里验证&#xff09;是正确的&#xff0c;大家可以参考&#xff01;&#xff01; 一、移…

数据写入HBase(scala)

package sourceimport org.apache.hadoop.hbase.{HBaseConfiguration, TableName} import org.apache.hadoop.hbase.client.{ConnectionFactory, Put} import org.apache.hadoop.hbase.util.Bytesobject ffff {def main(args: Array[String]): Unit {//hbase连接配置val conf …

扫雷游戏(C语言)

目录 一、前言&#xff1a; 二、游戏规则&#xff1a; 三、游戏前准备 四、游戏实现 1、打印菜单 2、初始化棋盘 3、打印棋盘 4、布置雷 5、排雷 五、完整代码 一、前言&#xff1a; 用C语言完成扫雷游戏对于初学者来说&#xff0c;难度并不是很大&#xff0c;而且通…

Linux的优先级说明

一、背景 在工作中&#xff0c;不少同学对nice&#xff0c;priority&#xff0c;schedue策略&#xff0c;实时优先级&#xff0c;普通进程优先级的概念混淆&#xff0c;导致最后的代码可能引入bug&#xff0c;本文将统一进行说明&#xff0c;部分内容参考网络大佬的文章 &…

有趣的css - 第一个字符串自动生成文字图标

在设计 app 界面的时候&#xff0c;要展示一部分最新的资讯入口&#xff0c;然后出了一张下面的 UI 稿。 UI稿截图如下&#xff1a; 列表设计比较简单&#xff0c;就是列表前面的圆形图标这块&#xff0c;我个人觉得还是有点意思的。 一般的话&#xff0c;大概率都是用js限制…

MYSQL基本查询(CURD:创建、读取、更新、删除)

文章目录 前言一、Create1.全列插入2.指定列插入3.插入否则更新4.替换 二、Retrieve1.SELECT列2.WHERE条件3.结果排序4.筛选分页结果 三、Update四、Delete1.删除数据2.截断表 五、插入查询结果六、聚合函数 前言 操作关系型数据库的编程语言&#xff0c;定义了一套操作关系型…

OJ_糖果分享游戏

题干 c实现 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<vector> using namespace std;void ShareCandy(vector<int>& student) {int size student.size();vector<int> share(size); //保存每个同学交换前&#xff0c;糖果数量…

[机器学习]简单线性回归——梯度下降法

一.梯度下降法概念 2.代码实现 # 0. 引入依赖 import numpy as np import matplotlib.pyplot as plt# 1. 导入数据&#xff08;data.csv&#xff09; points np.genfromtxt(data.csv, delimiter,) points[0,0]# 提取points中的两列数据&#xff0c;分别作为x&#xff0c;y …

【hcie-cloud】【23】容器编排【k8s】【Kubernetes常用工作负载、Kubernetes调度器简介、Helm简介、缩略词】【下】

文章目录 单机容器面临的问题、Kubernetes介绍与安装、Kubernetes对象的基本操作、Kubernetes YAML文件编写基础Kubernetes常用工作负载Kubernetes常用工作负载简介创建一个无状态nginx集群无状态工作负载Deployment说明无状态工作负载Deployment常见操作创建一个有状态的MySQL…

单链表实现通讯录(增删查改)

前言 之前写了很多次通讯录&#xff0c;一次比一次复杂&#xff0c;从静态到动态&#xff0c;再到文件操作&#xff0c;再到顺序表&#xff0c;今天要好好复习一下单链表&#xff0c;于是乎干脆用单链表再写一遍。 首先我们之前已经用单链表写过他的增删查改了&#xff0c;于…

1.28回溯(中等)

目录 1.格雷编码 2. 复原 IP 地址 3. 火柴拼正方形 1.格雷编码 n 位格雷码序列 是一个由 2n 个整数组成的序列&#xff0c;其中&#xff1a; 每个整数都在范围 [0, 2n - 1] 内&#xff08;含 0 和 2n - 1&#xff09;第一个整数是 0一个整数在序列中出现 不超过一次每对 相…

备战蓝桥杯----贪心算法(二进制)

已经差不多掌握了贪心的基本思想&#xff0c;让我们看几道比较趣的题吧&#xff01; 先来个比较有意思的题热热身&#xff1a; 法1.我们可以先把l,r化成二进制的形式。 然后分俩种情况&#xff1a; &#xff08;1&#xff09;若他们位数不一样并且位数高的全为1&#xff0c;…

在Shopee菲律宾站点进行选品时的策略

随着电子商务的快速发展&#xff0c;越来越多的卖家开始将目光投向了海外市场。作为东南亚地区最大的电商平台之一&#xff0c;Shopee菲律宾站点吸引了众多卖家的关注。然而&#xff0c;在这个竞争激烈的市场上&#xff0c;卖家需要制定一系列的策略&#xff0c;才能在选品中脱…

arcgis 批量删除字段

一、打开ArcToolbox-数据管理工具-字段-删除字段。 二、在输入表中选择要删除字段的要素&#xff0c;在删除字段栏中选择要删除的字段&#xff0c;点击确认即可。