二叉树中和为某一值的路径

// 面试题34:二叉树中和为某一值的路径
    // 题目:输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。
    // 从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
    static std::vector<std::vector<int>> find_path(const std::shared_ptr<node_bt<int>>& root, int num)
    {
        std::vector<std::vector<int>> matrix;
        if(root == nullptr)
        {
            return matrix;
        }

        std::vector<int> path;
        int sum = 0;
        _find_path(root, num, path, sum, matrix);

        return matrix;
    }

    static void _find_path(const std::shared_ptr<node_bt<int>>& root,
                         int num, std::vector<int>& path, int& sum,
                         std::vector<std::vector<int>>& matrix)
    {
        sum += root->data;
        path.push_back(root->data);

        // 如果是叶结点,并且路径上结点的和等于输入的值
        // 打印出这条路径
        if(sum == num && root->left == nullptr && root->right == nullptr)
        {
            std::vector<int> temp;
            for(auto& t:path)
            {
                temp.push_back(t);
            }
            matrix.push_back(temp);
        }

        // 如果不是叶结点,则遍历它的子结点
        if(root->left != nullptr)
        {
            _find_path(root->left, num, path, sum, matrix);
        }

        if(root->right != nullptr)
        {
            _find_path(root->right, num, path, sum, matrix);
        }

        // 在返回到父结点之前,在路径上删除当前结点,
        // 并在currentSum中减去当前结点的值
        sum -= root->data;
        path.pop_back();
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值