回溯法求解路径

 

class Solution {
public:
    vector<string>v;
    void InOrder(TreeNode*root,vector<int>&path)
    {
        if(root)
        {
            path.push_back(root->val);
            //到叶子结点
            if(root->left==NULL&& root->right==NULL)
            {
                string temp="";
                for(int i=0;i<path.size();i++)
                    temp=temp+to_string(path[i])+"->";
                temp.pop_back();
                temp.pop_back();
                v.push_back(temp);
            }
            else 
            {
                InOrder(root->left,path);
                InOrder(root->right,path); 
            }
            path.pop_back();
        }
    }
    vector<string> binaryTreePaths(TreeNode* root) 
    {
        vector<int>path;
        InOrder(root,path);
        return v;
    }
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回溯法求解单源路径问题的具体范例如下: 假设有一个有向图如下所示: 1->2, 1->3, 2->4, 3->4, 3->5, 4->5, 4->6, 5->6 其中数字表示节点,箭头表示有向边。 现在要求从节点1出发,到达节点6的所有路径。 使用回溯法求解,步骤如下: 1. 初始化路径path=[], visited={} 2. 从节点1开始遍历。将节点1加入路径path中,设置visited[1]=True 3. 遍历节点1的所有出边,即(1,2)和(1,3) 4. 对于(1,2),判断节点2是否已经被访问过。因为节点2还没有被访问过,将节点2加入路径path中,设置visited[2]=True。然后继续从节点2开始遍历。 5. 对于(2,4),判断节点4是否已经被访问过。因为节点4还没有被访问过,将节点4加入路径path中,设置visited[4]=True。继续从节点4开始遍历。 6. 对于(4,5),判断节点5是否已经被访问过。因为节点5还没有被访问过,将节点5加入路径path中,设置visited[5]=True。继续从节点5开始遍历。 7. 对于节点5,并没有可遍历的出边了,因此已经到达终点6。将路径path添加到结果集中。 8. 回溯到节点4,因为节点5已经被加入路径path中,需要从visited中删除,设置visited[5]=False。然后继续遍历节点4。 9. 对于(4,6),节点6还没有被访问过,将节点6加入路径path中,设置visited[6]=True。继续从节点6开始遍历。 10. 对于节点6,并没有可遍历的出边了,因此已经到达终点6。将路径path添加到结果集中。 11. 回溯到节点4,因为节点6已经被加入路径path中,需要从visited中删除,设置visited[6]=False。然后继续遍历节点4。 12. 回溯到节点2,因为节点4已经被加入路径path中,需要从visited中删除,设置visited[4]=False。然后继续遍历节点2。 13. 对于(2,3),节点3还没有被访问过,将节点3加入路径path中,设置visited[3]=True。继续从节点3开始遍历。 14. 对于(3,4),判断节点4是否已经被访问过。因为节点4已经被访问过,不再继续遍历。 15. 对于(3,5),判断节点5是否已经被访问过。因为节点5已经被访问过,不再继续遍历。 16. 对于节点3,并没有可遍历的出边了,因此已经结束遍历。 17. 回溯到节点1,因为节点2和节点3都已经被遍历过了,需要从visited中删除,设置visited[2]=False和visited[3]=False。继续遍历从节点1开始的出边。 18. 对于(1,3),因为节点3已经被访问过,不再继续遍历。 19. 对于(1,2),因为节点2已经被访问过,不再继续遍历。 20. 遍历结束,所有从节点1出发到达节点6的路径都已经到:[1->2->4->5->6, 1->3->4->5->6]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值