我是靠谱客的博主 甜蜜花卷,最近开发中收集的这篇文章主要介绍【二叉树】二叉树路径求和,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

题目(来源LintCode)

给定一个二叉树,找出所有路径中各节点相加总和等于给定 目标值 的路径。
一个有效的路径,指的是从根节点到叶节点的路径。

代码实现思路:
1.使用递归,计算临时和值,和target进行比较,如果相等则得到一条搜索路径。
2.暴力求解,遍历出所有的根节点到子节点的路径,然后计算每条路径的和,找出所有符合要求的路径。(不推荐)

//借鉴了高手的思路做了一下,这里使用C++实现

#include <iostream>
#include <vector>
using std::cout;
using std::endl;
using std::vector;

class TreeNode {
public:
    int val;
    TreeNode *left, *right;
    TreeNode(int val) {
        this->val = val;
        this->left = this->right = NULL;
    }
};

class Solution {
public:
    /**
    * @param root the root of binary tree
    * @param target an integer
    * @return all valid paths
    */
#if 0
    //将树的所有可能路径遍历出,按路径求和
    vector<vector<int>> binaryTreePathSum(TreeNode *root, int target) {
        vector<int> vec;
        vec.push_back(root->val);
        findOnePath(root,vec);
        return v;
    }

    void findOnePath(TreeNode *root,vector<int> vec){
        if (root == NULL){
            return;
        }

        if (root->left != NULL){
            vec.push_back(root->left->val);
            findOnePath(root->left, vec);
        }
        if (root->right != NULL){
            vec.push_back(root->right->val);
            findOnePath(root->right, vec);
        }
        if (root->left == NULL && root->right == NULL){
            v.push_back(vec);
        }
    }

    vector<vector<int>> v;
#else
    vector<vector<int>> binaryTreePathSum(TreeNode *root, int target) {
        if (root == NULL){
            return v;
        }
        vector<int> vec;
        vec.push_back(root->val);
        findPath(root, root->val, target, vec);
        return v;
    }

    void findPath(TreeNode *root, int sum, int target, vector<int> vec)
    {
        //当前节点为叶子节点
        if (root->left == NULL && root->right == NULL){
            if (sum == target){
                v.push_back(vec);
                return;
            }
        }
        //不是叶子节点的情况处理
        int s = 0;
        if (root->left != NULL){
            //vec的拷贝构造函数
            vector<int> vm(vec);
            s = sum + root->left->val;
            vm.push_back(root->left->val);
            findPath(root->left,s,target,vm);
        }

        if (root->right != NULL){
            vector<int> vm(vec);
            s = sum + root->right->val;
            vm.push_back(root->right->val);
            findPath(root->right, s, target, vm);
        }
    }

    vector<vector<int>> v;
#endif
};

int main()
{
    TreeNode *root = new TreeNode(1);
    TreeNode *l1 = new TreeNode(2);
    TreeNode *r1 = new TreeNode(4);
    root->left = l1;
    root->right = r1;
    TreeNode *l2 = new TreeNode(3);
    TreeNode *r2 = new TreeNode(2);
    l1->left = l2;
    l1->right = r2;

    Solution sol;
    sol.binaryTreePathSum(root, 5);
    auto it = sol.v.begin();
    while (it != sol.v.end()){
        auto pit = it->begin();
        while (pit != it->end()){
            cout << *pit++ << " ";
        }
        cout << endl;
        ++it;
    }
    system("pause");
    return 0;
}

最后

以上就是甜蜜花卷为你收集整理的【二叉树】二叉树路径求和的全部内容,希望文章能够帮你解决【二叉树】二叉树路径求和所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(43)

评论列表共有 0 条评论

立即
投稿
返回
顶部