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 ...
随机推荐
- CSS块级-内联元素,盒子模型
CSS元素 元素分类和区别 常用的块状元素有: <div>.<p>.<h1>~<h6>.<ol>.<ul>.<li> ...
- c# 窗体开发4 数据库访问技术
ADO.NET的名称起源于ADO(ACTIVEX DATA OBJECTS) USING SYSTEM; USING SYSTEM.COLLECTIONS.GENERIC; USING SYSTEM. ...
- Dictionary的遍历
Dictionary<string, int> list = new Dictionary<string, int>(); list.Add("d", 1) ...
- 静态链表-C语言实现
1.静态链表是在没有指针的编程语言里对链表的一种实现2.主要是用数组模拟指针3.在这里,使用结构体使数组的每一个空间可以存储一个数据元素(date)和一个游标(cur),游标的作用相当于链表的指针域, ...
- 《Windows内核安全与驱动开发》 7.1&7.2&7.3 串口的过滤
<Windows内核安全与驱动开发>阅读笔记 -- 索引目录 <Windows内核安全与驱动开发> 7.1&7.2&7.3 串口的过滤 一.设备绑定的内核API ...
- Vue3.0常用代码片段和开发插件
Vue3 Snippets for Visual Studio Code Vue3 Snippets源码 Vue3 Snippets下载 This extension adds Vue3 Code S ...
- #华为云·寻找黑马程序员# 如何实现一个优雅的Python的Json序列化库
在Python的世界里,将一个对象以json格式进行序列化或反序列化一直是一个问题.Python标准库里面提供了json序列化的工具,我们可以简单的用json.dumps来将一个对象序列化.但是这种序 ...
- Linux-Ubuntu学习笔记
因学习Python需求,特开此贴用于记录Linux-Ubuntu操作系统的学习笔记. Linux命令-基础版 Linux命令-高级版 此贴终结了,主要用于开发过程中忘记命令时使用.
- 图解leetcode —— 124. 二叉树中的最大路径和
前言: 每道题附带动态示意图,提供java.python两种语言答案,力求提供leetcode最优解. 描述: 给定一个非空二叉树,返回其最大路径和. 本题中,路径被定义为一条从树中任意节点出发,达到 ...
- SI522和RC522/ZS3801/FM17520的区别
小编最近在测试一颗新的芯片,是国内知名厂家中科微研发的,主打超低功耗的厂家. 经过测试和比较小编发现 相对于MFRC522,SI522可以完全替换,不需要做任何更改,同时接受模式下功耗低10mA左右, ...