当前位置: 首页 > news >正文

二叉树的所有路径(回溯算法基础)

257. 二叉树的所有路径 - 力扣(LeetCode)

统计二叉树的路径就是从根节点向下遍历直到叶子节点,但这个过程中有很多的细节,比如遍历到叶子节点后怎么再回退到根节点继续想另一个子树遍历,这里就用到了回溯算法。

代码实现:

class Solution {
private:void traversal(TreeNode*node,vector<int>&path,vector<string>&result){path.push_back(node->val);if(node->left==NULL&&node->right==NULL){string spath;for(int i=0;i<path.size()-1;i++){spath+=to_string(path[i]);spath+="->";}spath+=to_string(path[path.size()-1]);result.push_back(spath);return;}if(node->left){traversal(node->left,path,result);path.pop_back();}if(node->right){traversal(node->right,path,result);path.pop_back();}}
public:vector<string> binaryTreePaths(TreeNode* root) {vector<int>path;vector<string>result;if(root==NULL){return result;}traversal(root,path,result);return result;}
};

这道题统计的是路径,显然采用的是前序遍历,最开始应该是写好遍历到叶子节点后的逻辑:

每一次遍历到的节点值先插入到path数组中,再定义一个临时字符串,遍历每一个元素的值(储存在path中),为了防止最后一个元素后面也有->所以看起来麻烦一点,最后将字符串全部尾插到结果容器中。最后通过return结束当前递归调用,返回到上一层的递归调用中。

        path.push_back(node->val);if(node->left==NULL&&node->right==NULL){string spath;for(int i=0;i<path.size()-1;i++){spath+=to_string(path[i]);spath+="->";}spath+=to_string(path[path.size()-1]);result.push_back(spath);return;}

接下来就是涉及回溯的过程,但实际还是遍历,在节点不是叶子节点时,判断左右子树是否为空,不为空则递归向下循环。最后还要将当前值从path数组中pop出去,在递归循环中,向左右遍历几个节点,就会pop出几个节点。递归函数中不能细想,会绕进去,将代码分成块,解决每一部分,前序遍历时,是先中再左再右,将左子树都遍历完成后,也将左子树中的元素pop出,再遍历右子树。pop不会影响当前节点的递归过程,会影响到遍历到一个叶子后的过程。

        if(node->left){traversal(node->left,path,result);path.pop_back();}if(node->right){traversal(node->right,path,result);path.pop_back();}

http://www.xdnf.cn/news/190585.html

相关文章:

  • 深度学习---Pytorch概览
  • 3D模型文件格式之《DAE格式介绍》
  • [LeetCode 438/567] 找到字符串中所有字母异位词/字符串的排列(滑动窗口)
  • tsconfig.json的配置项介绍
  • 云原生周刊:Kubernetes v1.33 正式发布
  • 用JavaScript构建3D程序
  • 2025系统架构师---论微服务架构及其应用
  • Linux中的系统延时任务和定时任务与时间同步服务和构建时间同步服务器
  • 老电脑优化全知道(包括软件和硬件优化)
  • 【爬虫】一文掌握 adb 的各种指令(adb备忘清单)
  • 【Mybatis】Mybatis基础
  • 集合框架篇-java集合家族汇总
  • 【3D基础】深入解析OBJ与MTL文件格式:Blender导出模型示例及3D开发应用
  • 【KWDB 创作者计划】_企业数据管理的利刃:技术剖析与应用实践
  • CMake:设置编译C++的版本
  • 【北京】昌平区某附小v3700存储双控故障维修案例
  • 分布式链路追踪理论
  • 【Axure视频教程】手电筒效果
  • 【题解-Acwing】867. 分解质因数
  • 【蒸馏(5)】DistillBEV代码分析
  • FPGA-DDS信号发生器
  • 3D架构图软件 iCraft Editor 正式发布 @icraft/player-react 前端组件, 轻松嵌入3D架构图到您的项目
  • 数据可视化
  • 【C++教程】三目运算符
  • Day8 鼠标控制与32位模式切换
  • AIGC重构元宇宙:从内容生成到沉浸式体验的技术革命
  • 临床试验概述:从定义到实践的关键要素
  • R 语言科研绘图第 43 期 --- 桑基图-冲击
  • 软件设计师速通其一:计算机内部数据表示
  • 数据库学习笔记(十三)---存储过程