求二叉树的所有路径

题目描述

给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。

叶子节点 是指没有子节点的节点。

求二叉树的所有路径_第1张图片
通过这个题目,理解了c++中传参数带&和不带&的区别。

当传入的参数不带&时,函数运行结束arr变量还是原来的值(相当于函数内部arr只是个临时变量)

class Solution {
public:
    vector<string> array;

    string transform(vector<int>& arr){
        string res = "";
        if(arr.size() == 1){
            res += to_string(arr[0]);
            return res;
        }else{
            for(int i=0;i<arr.size()-1;i++){
                res += to_string(arr[i]);
                res += "->";
            }
            res += to_string(arr[arr.size()-1]);
        }
        return res;
    }

// 在preOrder中传入的vector,没有带上引用,表示按值传递
// 也就是说,每一次递归时,函数内部arr会改变,但是在函数外部,还是原先传入的值。
// 因此,也就不需要额外的回溯
// 也就是 第一次传arr是[1],第二次是[1,2],第三次是[1,2,5],
// 当递归到了出口往回走的时候,这些参数仍然不变,反而达到了回溯的效果
    void preOrder(TreeNode* root,vector<int> arr){
        string result;
        if(!root) return;
        else {
            arr.push_back(root->val);
            if(root->left == nullptr && root->right == nullptr){
                array.push_back(transform(arr));
            }else {
                preOrder(root->left,arr);
                preOrder(root->right,arr);
            }
        }
        
    }

    vector<string> binaryTreePaths(TreeNode* root) {
        vector<int> arr;
        preOrder(root,arr);
        return array;
    }
};

一开始的时候,我不知道带&和不带&的区别,在preOrder函数传参时,带了&,运行结果错误,如下:

求二叉树的所有路径_第2张图片
可以看出,带上&表示会修改你传入参数的值,函数运行结束参数的值也被改变了,这时候就需要进行回溯。

你可能感兴趣的:(记录部分写过的题目,leetcode,算法,c++)