dfs专题4——二叉树的深搜(验证二叉搜索树)

🔥近津薪荼: 个人主页 🎬个人专栏: 《近津薪荼的算法日记》 《Linux操作系统及网络基础知识分享》 《c++基础知识详解》 《c语言基础知识详解》 ✨任尔东西南北风


1.上期参考代码

cpp 复制代码
/* Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    TreeNode* pruneTree(TreeNode* root) {
        return dfs(root);
    }

    TreeNode* dfs(TreeNode* root) {
        if (root == nullptr) {
            return nullptr;
        }//出口
        root->left = dfs(root->left);
        root->right = dfs(root->right);
        if (root->left == nullptr && root->right == nullptr && root->val == 0) {
            return nullptr;//
        }//剪枝
        return root;
    }
};

2.本期知识点导图

3.本期要讲解的题目是

验证二叉搜索树

要点:

  • 二叉搜索树的定义(空树是特殊的搜索二叉树
  • node.val的取值

19小于20,不符定义

4.解题

由二叉搜索树的定义不难发现,二叉搜索树的中序遍历是有序的

利用中序遍历有序,我们就可以验证一颗二叉树是不是搜索二叉树。

后序遍历:

怎么判断遍历结果是否有序?

创建全局变量来实现:

我们创建一个全局变量prev,初始化为无穷小,然后与遍历结果一 一比对迭代即可。

本题的难度并不大,直接dfs中序遍历即可,

重点要说的是接下来的两个概念:

剪枝:

剪枝的定义:在遍历 / 搜索可能的解空间(可以抽象成树状结构,比如递归树、状态树)的过程中,提前判断当前分支 / 路径不可能得到有效解、最优解,或符合题目要求的解,并直接放弃遍历该分支的所有后续节点(相当于 "砍掉" 这根树枝),从而减少不必要的计算,大幅提升算法效率的优化手段。

简而言之:就是知道没有结局,就不要开始

在写这道题的遍历的过程中,大家可以尝试使用剪枝,其实也非常简单,也就是加几个逻辑判断的事。

回溯

几乎所有的递归中都有回溯,听起来高大上,其实大家已经见过很多次了,早在递归的第一道题中,我就给大家画了递推和递归图,其中递归(返回上一级)的操作,就叫做回溯,从本题之后,大家有对回溯有所体会就好~

代码逻辑:

  • 创建全局变量:prev无穷小(注意类型的取值范围)
  • 出口:
  • 中序遍历:左根右
  • 遍历过程中剪枝

5.下期要讲解的题目是:

二叉搜索树中第 K 小的元素

6.嗟食

如果小编写的内容对佬有帮助,还请大佬点点三连加关注哦
佬的支持就是我前进的最大动力 ~

下期见。

相关推荐
AOwhisky41 分钟前
Python 学习笔记(第十三期)——运维自动化(下·前篇):远程命令执行——paramiko基础篇
运维·python·学习·云原生·自动化·运维开发·paramiko
皓月斯语43 分钟前
B3842 [GESP202306 三级] 春游 题解
数据结构·c++·算法·题解
atunet44 分钟前
树状结构在查询优化中的作用与实现细节7
算法
前端世界1 小时前
MySQL 基础入门(学习第4天)——约束与 DML 操作详解
数据库·学习·mysql
dear_bi_MyOnly1 小时前
【SpringBoot配置文件】
java·spring boot·后端·学习·spring·java-ee·学习方法
AOwhisky1 小时前
Python 学习笔记(第十四期)——运维自动化(下·中篇):远程文件传输——paramiko进阶篇
运维·python·学习·云原生·自动化·文件传输·paramiko
徐凤年_1 小时前
rog_map参数理解
算法
春日见1 小时前
算法与数据结构----哈希表
数据结构·人工智能·算法·机器学习·自动驾驶·哈希算法·散列表
math_hongfan1 小时前
鸿蒙Flutter setState机制深入理解
学习·flutter·华为·harmonyos·鸿蒙
其实防守也摸鱼2 小时前
补天SRC新手入门指南:从0到1的漏洞挖掘之路
网络·python·学习·安全·web安全·数据挖掘·挖洞