力扣视频笔记21——深度优先搜素法+938题法

定义

(用到了递归的思想)
在这里插入图片描述
每一次把一个分支都检查完,才进入到下一个分支。
把一条路走到死,不撞南墙不回头那种。
走不出了,再去找第二条出路

在这里插入图片描述

DFS和回溯算法的区别

在这里插入图片描述
DFS:走到死,每条路线都是走到它最后一个节点为止。
在这里插入图片描述

回溯:满足条件时就停止了,不需要走到最后一个节点。
在这里插入图片描述

回溯,按照子集的长度开始(按照条件开始),第一次为0,在起点的时候已经满足了长度为0这个条件,此时就不需要遍历其他的可能性了。【】
在这里插入图片描述
接下来遍历长度为1的子集,当遍历元素1时已经满足了长度为1,就不要遍历后面的2,3 和3 了。元素2 3 同理。【1】,【2】,【3】

接着看长度为2的这个条件,当遍历元素1 2 时就已经满足条件了,就不去遍历接下来的3了
在这里插入图片描述
此时为【1,2】 【1,3】【2,3】
最后遍历长度为3,即【1,2,3】

题目938

在这里插入图片描述

思路+伪代码

这道题是二叉搜索树
即左节点值比当前根节点值小,右节点值比根节点值大。
方法一(递归)
JAVA 实现: 题目通过递归实现比较简单,阅读题目时需要注意一点:输出求和不是 L 和 R 节点之间的所有连接结点的总和,而是符合 L <= val <= R 的所有节点的总和,即例子 1 中 32 = 7 + 10 + 15,值为10的结点是处于L和R之间的结点;同理, 例子 2 中 23 = 6 + 7 + 10。二叉搜索树的特点为:若左子树不为空, 则左子树的所有结点都小于根节点; 若右子树不为空, 则右子树的所有结点都大于根节点。若该结点的值 val 处于 L 和 R 之间,则将该值加起来;若 val < L,根据二叉搜索树的特点,该结点的右边可能存在符号条件的值,继续搜寻该结点的右边;若 val > R,该结点的左边可能存在符号条件的值,继续搜寻该结点的左边。

按深度优先搜索的顺序计算范围和。记当前子树根节点为root,分以下四种情况讨论:

root 节点为空

返回 0。

root 节点的值大于high

由于二叉搜索树右子树上所有节点的值均大于根节点的值,即均大于high,故无需考虑右子树,返回左子树的范围和。

root 节点的值小于low

由于二叉搜索树左子树上所有节点的值均小于根节点的值,即均小于low,故无需考虑左子树,返回右子树的范围和。

root 节点的值在 [low,high] 范围内

此时应返回root 节点的值、左子树的范围和、右子树的范围和这三者之和。

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_45942265/article/details/118113878