LeeCode Practice Journal | Day18_Binary Tree06

530.二叉搜索树的最小绝对差

题目:530. 二叉搜索树的最小绝对差 - 力扣(LeetCode)
题解:代码随想录 (programmercarl.com)
验证搜索树的进阶,二叉树中的双指针,思考过程中发现容易弄混递归向下传播和向上回溯的过程

solution:
public class Solution {public int min = int.MaxValue;public TreeNode pre = null;public int GetMinimumDifference(TreeNode root) {Traversal(root);return min;}public void Traversal(TreeNode node){if (node == null) return;Traversal(node.left);if(pre != null) min = node.val - pre.val < min ? node.val - pre.val : min;pre = node;Traversal(node.right);}
}
summary:

key:

指针如何初始化:
在for循环中,pre指针初始值为null,遍历第一个节点时初始化,在二叉树递归时其实是一样的

501.二叉搜索树中的众数

题目:501. 二叉搜索树中的众数 - 力扣(LeetCode)
题解:代码随想录 (programmercarl.com)
简单的思路遍历一遍然后用哈希表统计,但那跟二叉搜索树的性质就没有关系了。。。
还是利用双指针在遍历的时候同时统计,思路比较清晰,但需要注意的细节比较多

solution:
public class Solution {public int count = 0;public int result = 0;public List<int> results = new List<int>();public TreeNode pre = null;public int[] FindMode(TreeNode root) {FindTraversal(root);return results.ToArray();}public void FindTraversal(TreeNode node){if (node == null) return;FindTraversal(node.left);if(pre != null && pre.val == node.val) count ++;else count = 1;if(count >= result){if(count > result) results.Clear();result = count;results.Add(node.val);}pre = node;FindTraversal(node.right);}
}
summary:

错误 & key:

count和result的更新:
原始代码:

if(pre == null) count ++;
else if(pre.val == node.val) count ++;
else count = 1;

本来的做法考虑的比较复杂,但其实count只分两种情况,重置与增加,遍历到第一个节点和值第一次出现的节点时重置,注意重置为1,不是第一个节点且值与上一个节点相同时增加,如下代码

if(pre != null && pre.val == node.val) count ++;
else count = 1;

236.二叉树的最近公共祖先

题目:236. 二叉树的最近公共祖先 - 力扣(LeetCode)
题解:代码随想录 (programmercarl.com)
将题目拆解了一下:
怎么求一个节点的祖先:前序遍历将经过接
怎么求多个节点的公共祖先

solution:

我的遍体鳞伤解法

public class Solution {private List<TreeNode> pathUtil = new List<TreeNode>();public TreeNode LowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {List<TreeNode> pathp = new List<TreeNode>();List<TreeNode> pathq = new List<TreeNode>();if (!pathTraversal(root, p, pathp) || !pathTraversal(root, q, pathq)) {return null; // 如果任意一个节点未找到,则返回 null}int count = Math.Min(pathp.Count, pathq.Count);TreeNode result = null;for (int i = 0; i < count; i++) {if (pathp[i] == pathq[i]) {result = pathp[i];} else {break;}}return result;}private bool pathTraversal(TreeNode root, TreeNode target, List<TreeNode> path) {if (root == null) return false;path.Add(root);if (root == target) return true;if (pathTraversal(root.left, target, path) || pathTraversal(root.right, target, path)) {return true;}path.RemoveAt(path.Count - 1); // 回溯return false;}
}

优雅解法

public class Solution {public TreeNode LowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {// 如果当前节点为空,或者当前节点是p或q,则直接返回当前节点if (root == null || root == p || root == q) {return root;}// 在左子树中递归查找TreeNode left = LowestCommonAncestor(root.left, p, q);// 在右子树中递归查找TreeNode right = LowestCommonAncestor(root.right, p, q);// 如果左子树和右子树都能找到目标节点,则当前节点就是最近公共祖先if (left != null && right != null) {return root;}// 否则,返回非空的子树(如果有),或者返回nullreturn left != null ? left : right;}
}
summary:

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

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

相关文章

STM32F103定时器中断详解

目录 目录 目录 前言 一.什么是定时器 1.1 STM32F103定时器概述 1.2基本定时器 1.2通用定时器 1.3高级定时器 1.4 三种定时器区别 基本定时器&#xff08;Basic Timer&#xff09; 通用定时器&#xff08;General-Purpose Timer&#xff09; 高级定时器&#xff08;Advanced Ti…

ubuntu2204配置anacondacuda4090nvidia驱动

背景 某个机房的几台机器前段时间通过dnat暴露至公网后被入侵挖矿&#xff0c;为避免一些安全隐患将这几台机器执行重装系统操作&#xff1b; 这里主要记录配置nvidia驱动及cuda&anaconda。 步骤 大概分为几个步骤 禁用nouveau配置grub显示菜单install nvidia-driveri…

基于Python+Django,开发的一个在线教育系统

一、项目简介 使用Python的web框架Django进行开发的一个在线教育系统&#xff01; 二、所需要的环境与组件 Python3.6 Django1.11.7 Pymysql Mysql pure_pagination DjangoUeditor captcha xadmin crispy_forms 三、安装 1. 下载项目后进入项目目录cd Online-educ…

【Rust光年纪】解锁Rust语言核心库奥秘:加密、数字签名和数据库操作全面解析

从加密到数据库&#xff1a;探索Rust语言丰富的工具库生态系统 前言 在Rust语言开发中&#xff0c;使用合适的库可以极大地提高代码的安全性和效率。本文将介绍一些用于加密、数字签名、数据库连接等功能的Rust语言库&#xff0c;帮助读者快速了解其核心功能、使用场景以及安…

Ubuntu2204搭建ceph17

Ceph 环境初始化搭建Ceph 本次实验基于VMware17 节点IPstorage01192.168.200.161storage01192.168.200.162storage01192.168.200.163 环境初始化 初始化基础环境&#xff0c;三节点执行 #!/bin/bash# 定义节点信息 NODES("192.168.200.161 storage01 root" "…

配置RIPv2的认证

目录 一、配置IP地址、默认网关、启用端口 1. 路由器R1 2. 路由器R2 3. 路由器R3 4. Server1 5. Server2 二、搭建RIPv2网络 1. R1配置RIPv2 2. R2配置RIPv2 3. Server1 ping Server2 4. Server2 ping Server1 三、模拟网络攻击&#xff0c;为R3配置RIPv2 四、在R…

Linux:Linux权限

目录 1. Linux权限的概念 2. Linux权限管理 2.1 文件访问者的分类 2.2 文件类型和访问权限 2.2.1 文件类型 2.2.2 基本权限 2.3 文件权限值的表示方法 2.4 文件访问权限的相关设置方法 2.4.1 chmod 2.4.2 chown 2.4.3 chgrp 2.4.4 umask 3. file指令 4. Linux目…

base SAS programming学习笔记13(Array)

1.Array array-name{dimension} <elements> array-name&#xff1a;向量名称 dimension&#xff1a;向量长度&#xff0c;默认为1&#xff1b; elements:列出变量名&#xff0c;变量名要么全是数值变量或者全是字符变量 array-name和variable不能相同&#xff1b;也不能和…

C++面试题之判断一个变量是不是指针

对于变量其实对应的就是内存&#xff0c;而内存并没有表明一定是什么数据类型&#xff0c;所以判断变量是否是一个指针其实是一个参数类型匹配问题&#xff0c;在C中支持函数的重载&#xff0c;那么不同的函数因为参数的不同从而匹配不同函数调用过程。 编译器在进行函数匹配调…

JAVA周总结(集合) 0721day

一.Collection集合 集合:可以存放多种类型数据的容器。 集合和数组的区别 数组的长度是固定的,集合的长度根据存储的数据发生改变。 数组只能存同一种类型的数组,而集合可以存多种类型。 1.2 单列集合常用类的继承体系 java.util.List: 添加的元素是有序、可重复 ; Lis…

欢迎来到 Mint Expedition:Web3 和 NFT 的新时代开始

7 月 15 日&#xff0c;Mint Expedition 正式开启&#xff0c;作为 Mint 生态系统的旗舰项目&#xff0c;将彻底变革 Web3 和 NFT 去中心化应用&#xff01; Mint Expedition 是 Mint 的最新航程&#xff0c;延续了 Mint Forest 的成功。Mint Forest 吸引了超过 41.4 万独立用…

PostgreSQL简介和安装

一、Postgresql简介&#xff1a; 1、PostgreSql是功能强大的&#xff0c;开源的关系型数据库&#xff0c;底层基于C语言实现&#xff1b; 2、开源&#xff1a;允许对PostgreSql进行封装&#xff0c;用于商业收费&#xff1b; 3、版本迭代速度快&#xff0c;正式版本已经到15.R…

(day21)leecode hot100字母异位词分组

描述 给你一个字符串数组&#xff0c;请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 示例 1: 输入: strs ["eat", "tea", "tan", "ate", "nat&qu…

Log4J reminder

Java JNDI and Log injection https://docs.oracle.com/javase/jndi/tutorial/ See also https://telegra.ph/Log4J-Vulnerability-Explained-07-21

【轻松拿捏】java中为什么要使用克隆?如何实现对象克隆?深拷贝和浅拷贝区别是什么?

java中为什么要使用克隆&#xff1f;如何实现对象克隆&#xff1f;深拷贝和浅拷贝区别是什么&#xff1f; 一、如何在Java中实现对象克隆 1.1 浅拷贝 1.2 深拷贝 1.3 区别总结 二、面试回答技巧 1. 定义克隆及其用途 2. 解释浅拷贝和深拷贝 3. 具体实现浅拷贝和深拷贝 …

ChatGPT:@EnableConfigurationProperties 和 @ConfigurationProperties注解

ChatGPT&#xff1a;EnableConfigurationProperties 和 ConfigurationProperties注解 EnableConfigurationProperties(ServiceProperties.class) ConfigurationProperties(prefix “cestc”) 这两个注解的关系 EnableConfigurationProperties 和 ConfigurationProperties 是 …

c++中 bitset set multiset 的用法

bitset 简介 bitset 是 c 标准库中的一个存储 0/1 的大小不可变的容器。严格来讲&#xff0c;它并不属于 STL。 内存变量为 bool 类型。 #include<bitset> // 头文件bitset<1000> bs; // 定义一个大小为 1000 长度的 bitset 容器&#xff0c;其中 每一位都为fal…

springboot中如果我想每个接口对应redis应该怎么做? 更改的时候只删除对应的缓存?

如果你想为每个接口设置对应的Redis缓存,并且在更改数据时只删除对应的缓存,可以按照以下步骤进行设计和实现: 为每个接口设计唯一的缓存键 为了区分不同接口的缓存,你需要为每个接口设计一个唯一的缓存键。缓存键可以包含接口的名称、参数等信息,以确保唯一性。例如: "sp…

在C#中,如何优化对象的创建和销毁以提高性能?

在C#中&#xff0c;优化对象的创建和销毁可以显著提高应用程序的性能。以下是一些常用的优化策略&#xff1a; 避免不必要的对象创建&#xff1a; 检查代码&#xff0c;避免在循环中创建临时对象。考虑重用对象或使用对象池。 使用值类型&#xff08;ValueType&#xff09;&am…

深度加速器 全面支持国服外服游戏加速

深度加速器现已部署多条高速游戏专线。支持港服&#xff1b;日服、韩服、台服、东南亚服、中东服、美服、澳服、欧服、俄服游戏登录和加速&#xff0c;深度加速器且提供国内外游戏加速功能。 深度IP转换器与深度加速器&#xff1a;两个产品功能有所不同&#xff0c;深度IP转换器…