【leetcode】二叉树的所有路径c++

题目描述:

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

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

示例 1:
在这里插入图片描述

输入:root = [1,2,3,null,5]
输出:[“1->2->5”,“1->3”]

示例2:

输入:root = [1]
输出:[“1”]

代码:

/**
 * 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:
    vector<string> binaryTreePaths(TreeNode* root) {
    
    
        vector<string> s;
        if(root==NULL)return s;
        string temp = to_string(root->val); //root不为空,先在当前路径temp中加入root的值
        solve_dfs(s,root,temp);
        return s;
    }
    void solve_dfs(vector<string>& s,TreeNode* root,string temp){
    
      //深度优先搜索
        if(root->left==NULL&&root->right==NULL){
    
        //叶子节点
            s.push_back(temp); //当前路径已结束,加入vector中
            return;
        }
        if(root->left){
    
     //左子节点递归处理,路径加上左子节点的值
            solve_dfs(s,root->left,temp+"->"+to_string(root->left->val)); 
        }
        if(root->right){
    
    
            solve_dfs(s,root->right,temp+"->"+to_string(root->right->val)); //右子节点递归处理,路径加上右子节点的值
        }
    }
};

分析:

找到每条到叶子节点的路径,因为直到遍历到叶子节点时路径才停止,应该使用深度优先搜索DFS。

设置dfs函数内临时变量temp记录当前的路径,vector记录所有保存的路径。

对于root:

若其左子节点和右子节点皆为空,说明当前已经访问到叶子节点,路径已经完成,将当前形成的路径temp加入vector中保存;

若其左子节点不为空,对其左子节点进行dfs操作直到找到一条路径;

若其右子节点不为空,对其右子节点进行dfs操作直到找到一条路径;

知识点总结:

①深度优先搜索DFS:
对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次
(与广度优先搜索的对比分析:https://www.jianshu.com/p/bff70b786bb6)

②对c++函数的变量使用“引用&”:
对于有&,则不会调用拷贝构函造数,也就不会生成副本,函数里实际操作的是参实本身
题中void solve_dfs(vector& s,TreeNode* root,string temp)的vector s是在函数执行过程中需要不断更新的量,要加&;root和temp只是该函数执行过程中的临时变量,不需要加&。

猜你喜欢

转载自blog.csdn.net/qq_40315080/article/details/120295629