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

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

因为题目要求路径是从上到下的,所以最好采用前序遍历。这样可以保证按从上到下的顺序将节点的值存入一个路径数组中。另外,此题还有一个难点就是如何求得所有路径。为了解决这个问题,我们需要用到回溯。回溯和递归不分家,每递归一次,我们就回溯一次,这样就能保证回到原来的位置,进而递归我们没有走过的节点,得到新的路径。大体思路就是这样,大家可以结合我的代码以及注释理解这道题目。另外,如果大家的二叉树遍历还不熟悉的话,最好先去看一下我的关于二叉树遍历的博客,再来看这道题,否则肯定会比较懵逼。

代码及注释如下:

/**
 * 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:
//参数有三个,一个为工作指针,一个为记录路径的数组,一个为储存最后结果的字符串数组
//注意千万不要将返回值设置为字符串数组,因为我们不需要每次递归都返回字符串,这跟之前每次递归返回数值不一样,我们这里将存储结果的容器放在参数引用就可以了
    void travel(TreeNode* cur,vector<int>& path,vector<string>& result){
        //这种记录路径的题目的递归终止条件不是遍历到空节点,而是遍历到叶子结点
        //为了确保将叶子结点也存入路径数组,需要在终止条件之前就push,否则会遗漏
        path.push_back(cur -> val);//处理逻辑
        //终止条件:遍历到叶子节点
         if(cur -> left == NULL && cur -> 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 (cur->left) { //递归左孩子 
            travel(cur->left, path, result);
            path.pop_back(); // 回溯
        }
        if (cur->right) { // 递归右孩子
            travel(cur->right, path, result);
            path.pop_back(); // 回溯
        }
    }
    vector<string> binaryTreePaths(TreeNode* root) {
       vector<int> path;
       vector<string> result;
       if(root == NULL) return result;
       travel(root,path,result);
       return result;
 }
};


http://www.kler.cn/a/520900.html

相关文章:

  • PDF2WORD万能方法,如何控制Adobe dc pro,自动实现PDF转word
  • 如何保证P2P能源交易的安全性
  • 《RWA全球产业白皮书》发布:向凌云教授解析全球经济转型与RWA的未来
  • 操作系统(Linux Kernel 0.11Linux Kernel 0.12)解读整理——内核初始化(main init)之控制台工作
  • 【C++图论】2685. 统计完全连通分量的数量|1769
  • 数据结构——堆(C语言)
  • Shodan Dorks安装指南,通过Shodan搜索漏洞
  • FLTK - FLTK1.4.1 - demo - adjuster.exe
  • Vue-day2
  • 人形机器人,自动驾驶“老炮”创业第二站
  • k8s简介,k8s环境搭建
  • 《Java程序设计》课程考核试卷
  • 【mybatis】 插件 idea-mybatis-generator
  • 强化学习数学原理(二)——贝尔曼公式
  • Excel 技巧21 - Excel中整理美化数据实例,Ctrl+T 超级表格(★★★)
  • Redis 的热 Key(Hot Key)问题及解决方法
  • QT实现有限元软件操作界面
  • 本地大模型编程实战(03)语义检索(2)
  • 【Linux课程学习】:锁封装(Mutex)线程封装(Thread),this指针
  • 壁纸设计过程中如何增加氛围感