【算法】二叉树中的dfs

news2024/12/27 9:37:16



快乐的流畅:个人主页


个人专栏:《算法神殿》《数据结构世界》《进击的C++》

远方有一堆篝火,在为久候之人燃烧!

文章目录

  • 引言
  • 一、计算布尔二叉树的值
  • 二、求根节点到叶节点数字之和
  • 三、二叉树剪枝
  • 四、验证搜索二叉树
  • 五、二叉搜索树中第k小的元素
  • 六、二叉树的所有路径
  • 总结

引言

dfs在二叉树中有了更进一步地体现,通过二叉树中的dfs相关题型,深刻理解全局变量、回溯和剪枝

一、计算布尔二叉树的值


思路:

  1. 先计算出左右子树的值,再根据当前结点的值进行逻辑运算
  2. 终止条件:叶子节点时,返回节点值
class Solution
{
public:
    bool dfs(TreeNode* root)
    {
        if(!root->left && !root->right) return root->val;

        bool left = dfs(root->left);
        bool right = dfs(root->right);
        return root->val == 2 ? left || right : left && right;
    }

    bool evaluateTree(TreeNode* root)
    {
        return dfs(root);
    }
};

二、求根节点到叶节点数字之和


思路:

  1. 函数头设计:presum保存从根节点到当前节点路径的和,返回值代表左右子树所有路径之和
  2. presum设置为临时变量,以便回溯
  3. 每次先计算当前路径和sum,再返回左右子树所有路径之和
  4. 终止条件:root为空,则返回0;root为叶子节点,则返回当前路径的数字和
class Solution
{
public:
    int dfs(TreeNode* root, int presum)
    {
        if(!root) return 0;

        int sum = presum*10 + root->val;
        if(!root->left && !root->right) return sum;

        return dfs(root->left, sum) + dfs(root->right, sum);
    }

    int sumNumbers(TreeNode* root)
    {
        return dfs(root, 0);
    }
};

三、二叉树剪枝


思路:

  1. 每次先遍历左右子树进行剪枝(注意链接起来)
  2. 再判断当前结点是否为叶子节点,且值为0,若成立则删除该结点,返回空,否则返回该节点
  3. 终止条件:root为空,返回空
class Solution
{
public:
    TreeNode* dfs(TreeNode* root)
    {
        if(!root) return nullptr;

        root->left = dfs(root->left);
        root->right = dfs(root->right);
        if(!root->left && !root->right && root->val == 0) return nullptr;
        else return root;
    }

    TreeNode* pruneTree(TreeNode* root)
    {
        return dfs(root);
    }
};

四、验证搜索二叉树


思路:

  1. prev保存上一个结点的值,以便与当前结点进行比较
  2. 中序遍历,如果prev < root->val,则更新prev,否则返回false
  3. 剪枝:每次对当前情况判断,若不满足直接返回false,不用继续深搜判断
  4. 终止条件:如果root为空,则返回true
class Solution
{
public:
    long long prev = LLONG_MIN;

    bool dfs(TreeNode* root)
    {
        if(root == nullptr) return true;

        if(!dfs(root->left)) return false;
        if(prev < root->val) prev = root->val;
        else return false;
        if(!dfs(root->right)) return false;

        return true;
    }

    bool isValidBST(TreeNode* root)
    {
        return dfs(root);
    }
};

五、二叉搜索树中第k小的元素


思路:

  1. count计算访问结点次数,ret保存结果
  2. 中序遍历,每次–count,当count为0,则保存结果
  3. 终止条件:当root为空时,return;
  4. 剪枝:当count为空时,return;
class Solution
{
public:
    int count = 0;
    int ret = -1;

    void dfs(TreeNode* root)
    {
        if(root == nullptr || count == 0) return;

        dfs(root->left);
        --count;
        if(count == 0) ret = root->val;
        dfs(root->right);
    }

    int kthSmallest(TreeNode* root, int k)
    {
        count = k;
        dfs(root);
        return ret;
    }
};

六、二叉树的所有路径


思路:

  1. ret保存所有路径,path表示单条路径
  2. path设置为临时变量,以便回溯
  3. 先序遍历,若为叶子节点,则加上当前字符,并添加到ret中,若不为叶子节点,则加上当前字符和 “->”
  4. 终止条件:当root为空,return;
class Solution
{
    vector<string> ret;
public:
    void dfs(TreeNode* root, string path)
    {
        if(!root) return;

        if(!root->left && !root->right)
        {
            path += to_string(root->val);
            ret.push_back(path);
        }
        else path += to_string(root->val) + "->";
        dfs(root->left, path);
        dfs(root->right, path);
    }

    vector<string> binaryTreePaths(TreeNode* root)
    {
        dfs(root, "");
        return ret;
    }
};

总结

  • 全局变量
    • 在dfs中,全局变量非常好用(能拉全局就拉全局),它可以减少函数头设计的参数,简化函数体过程
    • 但是有时使用临时变量更加合适,这种情况出现在“恢复现场”比较麻烦时,用临时变量反而能大大简化过程
  • 回溯
    • 回溯的过程中,要“恢复现场”
  • 剪枝
    • 即时进行判断,避免不必要的搜索

真诚点赞,手有余香

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

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

相关文章

该从哪些方面提升系统的吞吐量?

更多大厂面试内容可见 -> http://11come.cn 该从哪些方面提升系统的吞吐量&#xff1f; 我们平时自己做的项目一般没有用户量&#xff0c;都是练手项目&#xff0c;所以并不会在吞吐量上做出很多的优化&#xff0c;但是这样的话&#xff0c;又会导致项目和其他人相比并没有…

mysql设置远程访问权限,允许其他IP访问

文章目录 更改mysql配置文件登录mysql 更改mysql配置文件 查找.ini或者.cnf文件 更改bind-address为0.0.0.0 [mysqld] character-set-serverutf8mb4 bind-address0.0.0.0 default-storage-engineINNODB [mysql] default-character-setutf8mb4 [client] default-character-s…

ppt保存文件奇怪问题

我发现ppt中的形状保存成jpg,png和pdf时&#xff0c;格式不一样 比如 当右键单击时&#xff0c;然后选择另存为图片 png格式 jpg格式 pdf格式 感觉还是很奇怪&#xff0c;就pdf的格式比较靠谱一点

Java---类和对象第一节

目录 1.面向对象初步认识 1.1什么是面向对象 1.2面向对象和面向过程的区别 2.类的定义和使用 2.1简单认识类 2.2类的定义格式 2.3类的实例化 2.4类和对象的说明 3.this关键字 3.1访问本类成员变量 3.2调用构造方法初始化成员变量 3.3this引用的特性 4.对象的构造以…

国内有哪些知名的网络安全厂商?

首先就是360&#xff0c;这个我相信大家并不陌生了吧&#xff0c;你的电脑装过360么&#xff1f; 360在个人终端服务那是妥妥的扛把子&#xff0c;但是在企业服务里虽然有他们的身影却略显不足。 第二个就是深信服&#xff0c;网络安全的老牌大佬&#xff0c;业务覆盖了全球5…

什么是XXE漏洞,日常如何做好web安全,避免漏洞威胁

随着网络技术的不断发展&#xff0c;网站安全问题日益受到人们的关注。当前随着技术发展&#xff0c;网站存在一些常见的可能被攻击者利用的漏洞&#xff0c;而在众多网站安全漏洞中&#xff0c;XXE&#xff08;XML External Entity&#xff09;漏洞是一个不容忽视的问题。今天…

linux性能监控之slabtop

slabtop命令是以实时的方式显示内核slab缓冲区的细节信息&#xff0c;是linux自带的命令 [rootk8s-master ~]# slabtop --helpUsage:slabtop [options]Options:-d, --delay <secs> delay updates-o, --once only display once, then exit-s, --sort <char&…

【WEEK11】 【DAY6】员工管理系统第七部分【中文版】

2024.5.11 Saturday 接上文【WEEK11】 【DAY5】员工管理系统第六部分【中文版】 目录 10.8.删除及404处理10.8.1.修改list.html10.8.2.修改EmployeeController.java10.8.3.重启10.8.4. 404页面处理10.8.4.1.把404.html文件移入10.8.4.2.重启并运行 10.8.5.退出登录状态10.8.5.1…

51基于单片机的温室大棚系统设计

设计摘要&#xff1a; 本设计旨在基于51单片机和蓝牙技术&#xff0c;实现一个功能完善的温室大棚系统。该系统具备以下主要功能&#xff1a;首先&#xff0c;通过连接的显示屏能够实时地显示当前的温度和湿度信息&#xff0c;方便用户了解温室内的环境变化。其次&#xff0c;…

Codeforces Round 605 (Div. 3) A~D

本人水平不高&#xff0c;开这个专栏主要是督促自己补题&#xff0c;有些题对目前的我来说还比较难&#xff0c;还补不动&#xff0c;等以后能力上来了再补。。。 原题链接&#xff1a;Dashboard - Codeforces Round 605 (Div. 3) - Codeforces 目录 A. Three Friends B. Sn…

✨✨使用vue3打造一个el-form表单及高德地图的关联组件实例✨

✨1. 实现功能 &#x1f31f;表单内显示省市县以及详细地址 点击省市县输入框时&#xff0c;打开对应地图弹窗&#xff0c;进行位置选择选择位置回显入对应输入框表单内的省市县以及地址输入框同外嵌表单走相同的校验方式触发校验后点击reset实现清除校验与清空数据 &#x1f…

Web开发小知识点(二)

1.关于取余 我在Dart语言里&#xff08;flutter项目&#xff09; int checkNum (10 - 29) % 10; 那么checkNum等于1 但是在Vue项目里 const checkNum (10 - 29) % 10;却等于-9 语言的特性不同&#xff0c;导致结果也不同&#xff0c;如果要想和Dart保持一致&#xff0c;…

Task Office for Mac v9.0激活版:任务管理新境界

还在为繁琐的任务管理而烦恼吗&#xff1f;Task Office for Mac为您带来全新的任务管理体验。简洁明了的界面设计&#xff0c;让您轻松上手&#xff1b;强大的任务管理和项目管理功能&#xff0c;让您轻松掌握任务进度&#xff1b;多用户协作功能&#xff0c;让团队协作更加高效…

自定义实现 Java17+SpringBoot3+OpenAPI+Knife4j Starter

文章目录 前言正文1 创建starter项目1.1 依赖文件1.2 配置信息 2 自定义starer代码开发2.1 配置字段的定义2.2 自动配置类 3 验证starter3.1 测试项目的配置3.2 功能配置 application.yml3.3 测试代码3.3.1 实体类3.3.2 控制器13.3.2 控制器2 4 效果展示4.1 主页4.2 实体类列表…

day08-面向对象高级

1.代码块 1.1代码块引出 有时我们在使用构造方法时&#xff0c;除了进行属性的初始化外还需要使用一些其他的语句&#xff0c;以便更好的实现程序的功能&#xff0c;比如添加一些输出语句&#xff1b; 1.2 局部代码块 public void show(){System.out.println("show&quo…

Line Buffer概述

buffer在芯片物理上一般指的是SRAM&#xff0c;也可以指寄存器组。buffer的作用是用来在逻辑芯片上暂时存储数据&#xff0c;但不会是大量的数据。如果是大量数据一般会使用DRAM&#xff08;典型的指DDR&#xff09;作为存储芯片&#xff0c;用来存储大密度数据。line buffer可…

物流单打印机怎么调格式距离,佳易王物流托运单管理系统软件打印单据左边距调节教程

物流单打印机怎么调格式距离&#xff0c;佳易王物流托运单管理系统软件打印单据左边距调节教程 一、前言 以下软件操作教程以&#xff0c;佳易王物流单打印管理软件为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 1、佳易王物流单管理系统打印…

先进电机技术 —— 控制策略综述

一、先进电机控制策略综述 电机控制策略随着电力电子技术和微处理器技术的发展而日趋丰富和完善&#xff0c;各种先进的控制方法被广泛应用于直流电动机、交流电动机&#xff08;同步电机、感应电机&#xff09;等多种电机类型。下面是对几种主要先进电机控制策略的概述&#x…

ExcelVBA在选择区域(有合并)中删除清除空行

【问题】 关于删除空行&#xff0c;以前是用函数来完成工作的&#xff0c; 今天有人提出问题&#xff0c;传来这个文件&#xff0c; 现有数据&#xff0c;1w多行&#xff0c;其中有部分列有不同合并单元格&#xff0c;跨行也不一样。如果要进行筛选删除空行&#xff0c;有一定的…

工程师工具箱系列(1)MapStruct

文章目录 工程师工具箱系列&#xff08;1&#xff09;MapStruct芸芸众生初窥门径引入POM依赖创建转换器与方法进行使用IDEA好基友 游刃有余示例说明避免编写重复转换器实现复杂灵活转换 温故知新 工程师工具箱系列&#xff08;1&#xff09;MapStruct 芸芸众生 在Java项目开发…