Leetcode题解 - 树、DFS部分简单题目代码+思路(700、671、653、965、547、473、46)
700. 二叉搜索树中的搜索 - 树
给定二叉搜索树(BST)的根节点和一个值。 你需要在BST中找到节点值等于给定值的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 NULL。
思路:
二叉搜索树的特点为左比根小,右比根大。那么目标结点就有三种可能:
1. 和根一样大,那么直接返回根即可。
2. 比根的值小,那么应该再去次左子树中搜索。
3. 比根的值大,那么应该再次去右子树中搜索。
可以看到这就是一个递归的思路。
class Solution:
def searchBST(self, root: TreeNode, val: int) -> TreeNode:
if not root:
return
if val == root.val:
return root
# 比根的值小就去左子树
if val < root.val:
lres = self.searchBST(root.left, val)
if lres: return lres
# 否则就去右子树
if val > root.val:
rres = self.searchBST(root.right, val)
if rres: return rres
return None
671. 二叉树中第二小的节点 - 树
给定一个非空特殊的二叉树,每个节点都是正数,并且每个节点的子节点数量只能为 2 或 0。如果一个节点有两个子节点的话,那么这个节点的值不大于它的子节点的值。
给出这样的一个二叉树,你需要输出所有节点中的第二小的值。如果第二小的值不存在的话,输出 -1 。
思路:
(并没有想到很巧妙的方法emmm)
直接BFS遍历树,将大于根结点的值都保存起来(因为题目条件中说明了子节点的值都是大于or等于父节点的,那么根一定是最小的),如果这些值存在那么最小的一个一定为第二小的,否则就是不存在。
# self.right = None
class Solution:
def findSecondMinimumValue(self, root: TreeNode) -> int:
if not root:
return -1
Q = [root]
res = []
while len(Q) != 0:
node = Q.pop(0)
if node.val > root.val:
res.append(node.val)
if node.left:
Q.append(node.left)
if node.right:
Q.append(node.right)
if len(res) == 0:
return -1
return min(res)
*653. 两数之和 IV - 输入 BST - 树 -> 双指针 *
给定一个二叉搜索树和一个目标结果,如果 BST 中存在两个元素且它们的和等于给定的目标结果,则返回 true。
思路:
(看了题解才想出来...两个数字和的问题似乎经常和双指针有关)
因为是二叉搜索树,所以中序遍历的结果就是一个递增序列。双指针法的前提就是递增序列,然后用一个指针指向头,一个指针指向尾,不断移动两个指针判断是否符合条件。
class Solution:
def findTarget(self, root: TreeNode, k: int) -> bool:
inRes = []
# 中序遍历
def Inorder(root):
if not root:
return
Inorder(root.left)
inRes.append(root.val)
Inorder(root.right)
Inorder(root)
# 双指针
head = 0; tail = len(inRes) - 1
while head < tail:
res = inRes[head] + inRes[tail]
# 如果大于目标值,就让尾指针左移
if res > k:
tail -= 1
# 如果小于目标值,就让头指针右移
if res < k:
head += 1
if res == k:
return True
return False
965. 单值二叉树 - 树
如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。
只有给定的树是单值二叉树时,才返回 true;否则返回 false。
思路:
遍历一遍树即可,这里采用的是层次遍历,但凡出现和根结点的值不同的值就绝对不是单值。
class Solution:
def isUnivalTree(self, root: TreeNode) -> bool:
if not root:
return False
Q = [root]
check = root.val
while len(Q) != 0:
node = Q.pop(0)
if node.val != check:
return False
if node.left:
Q.append(node.left)
if node.right:
Q.append(node.right)
return True
547. 朋友圈 - DFS -> 统计连通块的数量
班上有 N 名学生。其中有些人是朋友,有些则不是。他们的友谊具有是传递性。如果已知 A 是 B 的朋友,B 是 C 的朋友,那么我们可以认为 A 也是 C 的朋友。所谓的朋友圈,是指所有朋友的集合。
给定一个 N * N 的矩阵 M,表示班级中学生之间的朋友关系。如果M[i][j] = 1,表示已知第 i 个和 j 个学生互为朋友关系,否则为不知道。你必须输出所有学生中的已知的朋友圈总数。
思路:
直接套DFS模板即可,相当于判断一共做了几次DFS。
这个题的本质就是在求图中有几个连通块。
class Solution:
def findCircleNum(self, M: List[List[int]]) -> int:
res = 0
vis = set()
# 每一次的DFS都会把属于同一个朋友圈的人加上vis中
def DFS(node):
vis.add(node)
for i in range(len(M[node])):
if M[node][i] == 1 and i not in vis:
DFS(i)
for i in range(len(M)):
# 剩下的没有被加入vis中才会再次进行DFS
if i not in vis:
DFS(i)
res += 1
return res
DFS - 求出所有的组合
473. 火柴拼正方形 - 含重复
输入为小女孩拥有火柴的数目,每根火柴用其长度表示。输出即为是否能用所有的火柴拼成正方形。
输入: [1,1,2,2,2]
输出: true
解释: 能拼成一个边长为2的正方形,每边两根火柴。
输入: [3,3,3,3,4]
输出: false
解释: 不能用所有火柴拼成一个正方形。
思路:
对于每一根火柴来说,它都有四个边可以去(不同的火柴可以去相同的边),这样只要求解出所有火柴的每一种摆放组合就可以得知是否能够称为正方形
"""
DFS遍历所有可能性
本题剪枝很重要,不然会很容易超时。
"""
class Solution:
def makesquare(self, nums) -> bool:
# 如果数组和不是4的倍数,一定不能拼成正方形
sumRes = sum(nums)
if len(nums) < 4 or sum(nums) % 4 != 0:
return False
# 若有一个数大于数组和/4,也一定不能拼成正方形
check = sumRes // 4
nums.sort(reverse=True)
if nums[0] > check:
return False
# 遍历每根火柴loc为该跟火柴的下标,square为正方形的各个边
def DFS(loc, square):
if len(set(square)) == 1 and 0 not in square and loc == len(nums):
return True
if loc > len(nums) -1:
return
# 每根火柴有四个地方可以放置
for i in range(4):
if square[i] + nums[loc] <= check:
square[i] += nums[loc]
# 让下一个位置的火柴去放
if DFS(loc + 1, square):
return True
# 表示不应该放在这个位置
square[i] -= nums[loc]
return False
return DFS(0, [0, 0, 0, 0])
46. 全排列 - 不含重复
给定一个没有重复数字的序列,返回其所有可能的全排列。
思路:
就是DFS的套路,(一共有n个数字,n个位置)每个位置都有n个数字可以选择,在一次排列中一个数字只能属于一个位置。
class Solution:
def permute(self, nums):
vis = set()
r = []
def DFS(loc, res):
if loc == len(nums):
r.append(res.copy())
# 每个位置n个数字
for i in nums:
if i not in vis:
vis.add(i)
res[loc] = i
DFS(loc + 1, res)
vis.remove(i)
DFS(0, [0] * len(nums))
return sorted(r)
Leetcode题解 - 树、DFS部分简单题目代码+思路(700、671、653、965、547、473、46)的更多相关文章
- Leetcode题解 - 贪心算法部分简单题目代码+思路(860、944、1005、1029、1046、1217、1221)
leetcode真的是一个学习阅读理解的好地方 860. 柠檬水找零 """ 因为用户支付的只会有5.10.20 对于10元的用户必须找一个5 对于20元的用户可以找(三 ...
- Leetcode题解 - DFS部分简单题目代码+思路(113、114、116、117、1020、494、576、688)
这次接触到记忆化DFS,不过还需要多加练习 113. 路径总和 II - (根到叶子结点相关信息记录) """ 思路: 本题 = 根到叶子结点的路径记录 + 根到叶子结点 ...
- Leetcode题解 - 树部分简单题目代码+思路(105、106、109、112、897、257、872、226、235、129)
树的题目中递归用的比较多(但是递归是真难弄 我
- Leetcode题解 - DFS部分题目代码+思路(756、1034、1110、491、721、988)
756. 金字塔转换矩阵 """ 学到的新知识: from collections import defaultditc可以帮我们初始化字典,不至于取到某个不存在的值的时 ...
- Leetcode题解 - 链表简单部分题目代码+思路(21、83、203、206、24、19、876)
- Leetcode题解 - BFS部分题目代码+思路(896、690、111、559、993、102、103、127、433)
和树有关的题目求深度 -> 可以利用层序遍历 -> 用到层序遍历就想到使用BFS 896. 单调数列 - 水题 class Solution: def isMonotonic(self, ...
- BZOJ_3252_攻略_线段树+dfs序
BZOJ_3252_攻略_线段树+dfs序 Description 题目简述:树版[k取方格数] 众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他可以同时攻略k部游戏.今天他得到了一款新游戏< ...
- Leetcode 与树(TreeNode )相关的题解测试工具函数总结
最近在剑指Offer上刷了一些题目,发现涉及到数据结构类的题目,如果想在本地IDE进行测试,除了完成题目要求的算法外,还需要写一些辅助函数,比如树的创建,遍历等,由于这些函数平时用到的地方比较多,并且 ...
- c++ LeetCode (网易面试题和链表以及树篇) 五道算法例题代码详解(三)
原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/11209807.html 一.1道网易c++的面试题 我当时第一时间的解答方案 #include ...
随机推荐
- Spring Boot2 系列教程(二十九)Spring Boot 整合 Redis
经过 Spring Boot 的整合封装与自动化配置,在 Spring Boot 中整合Redis 已经变得非常容易了,开发者只需要引入 Spring Data Redis 依赖,然后简单配下 red ...
- Delphi - 调用SuperDll 持续更新
调用SuperDll 接上一篇Delphi创建Superdll,将生成的SuperDll.dll文件复制到本工程路径下,创建如下代码进行Superdll各个接口的测试. 创建uSuperDll.pas ...
- 引用公共页面的js函数报错
对于网站来说很多页面之间都有着大量的共享模块,如页头,页脚和用户栏等.很多时候为了方便.省事,我们在公共模块写函数,然后在别的页面里调用.但我们在引用公共的js函数时,有些可以引用,有些却报错:这是因 ...
- Git 如何优雅地回退代码
前言 从接触编程就开始使用 Git 进行代码管理,先是自己玩 Github,又在工作中使用 Gitlab,虽然使用时间挺长,可是也只进行一些常用操作,如推拉代码.提交.合并等,更复杂的操作没有使用过, ...
- ssm三大框架整合基本配置
ssm三大框架整合基本配置 maven目录结构 数据库脚本mysql create database maven; use maven ; -- --------------------------- ...
- 浅议Grpc传输机制和WCF中的回调机制的代码迁移
浅议Grpc传输机制和WCF中的回调机制的代码迁移 一.引子 如您所知,gRPC是目前比较常见的rpc框架,可以方便的作为服务与服务之间的通信基础设施,为构建微服务体系提供非常强有力的支持. 而基于. ...
- EasyUI整合SpringBoot,Spring Data对数据的分页操作
EasyUI的用法可以看中文官网,看插件是如何使用的 EasyUI中文官网 前端页面 <table id="dg" title="My Users" cl ...
- 测试工程师有福啦!一键生成api文档及测试功能
最近发现一个比较好用的插件,可根据api的功能注释说明一键生成文档以及功能demo: swaggerUI 是一个简单的Restful API 测试和文档工具.简单.漂亮.易用.通过读取JSON 配置显 ...
- ARTS-S python抽象方法抽象类
# coding: utf-8 from abc import ABC, abstractmethod class AbstractClassExample(ABC): def __init__(se ...
- vue项目中使用腾讯地图
最近在使用腾讯地图api(以下以位置数据可视化API为例),在初建项目之后,按照官网的说法,直接引入 再将官网的初始化例子放一个方法 在mounted中调用即可看到腾讯地图,但是我引入之后,一直报TM ...