算法day43 二叉树的所有路径

题目描述
力扣257:二叉树的所有路径

思路:前序递归+回溯
要搜寻二叉树的所有路径,依然绕不开递归算法,此时要注意的是在判断一条路径是否已经到达终点(即是否搜寻到了叶节点)的过程中,我们应该在判断叶节点之前收集叶节点保存的值,否则会跳过叶节点值的收集,导致漏值。同时,在搜寻到尾部之后,需要不断的回溯回到相对的根节点,方便再次搜寻另外的路径,完整的代码如下。

void traversal(TreeNode * cur,vector<int> & value,vector<string> &res){
    //以前序遍历过程进行遍历
    //这里要在判断是否是叶节点之前进行值的获取,否则会遗漏
    value.push_back(cur->val);
    //判断是否是叶节点,叶节点的话,说明一条路径上的值已经收集完毕,此时进行字符串拼接,加入到res中
    if(cur->left == nullptr && cur -> right == nullptr){
        string s;
        for(int i = 0 ;i < value.size();i++){
            if(i != value.size()-1){
                s += to_string(value[i]) + "->";
            }else{
                s += to_string(value[i]);
            }
        }
        res.push_back(s);
        return ;
    }
    //如果左侧还存在,那么递归遍历把左侧的路径找出来
    if(cur -> left){
        traversal(cur -> left ,value,res);
        //每一层过后将当前的尾部弹出,从而在收集完左侧路径后能够回溯回根节点
        value.pop_back();
    }
    //右侧与左侧同理
    if(cur -> right){
        traversal(cur -> right,value,res);
        value.pop_back();
    }
}
vector<string> binaryTreePaths(TreeNode* root) {
    vector<string> res;
    vector<int> value;
    traversal(root,value,res);
    return res;
}

时间复杂度:O(n)
空间复杂度:O(n)

posted on 2025-06-25 09:57  sakura430  阅读(9)  评论(0)    收藏  举报