二叉树的路径和

来源:互联网 发布:棋牌游戏数据库 编辑:程序博客网 时间:2024/06/05 14:37

题目:

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

一个有效的路径,指的是从根节点到叶节点的路径。

样例:

给定一个二叉树,和 目标值 = 5:

     1    / \   2   4  / \ 2   3

返回:

[  [1, 2, 2],  [1, 4]]
思路:

当访问到某一结点时,把该结点添加到vector<int>上,并累加当前结点的值。如果当前结点为叶结点并且当前路径的和刚好等于输入的整数,则当前的路径符合要求,把它添加到vector<vector<int>>。如果当前结点不是叶结点,则继续访问它的子结点。当前结点访问结束后,递归函数将自动回到双亲,重复上述步骤,但要注意将路径上的该结点和路径和中该结点的值删除。

/**

 * Definition of TreeNode:
 * 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
     */
     vector<vector<int>>vv;
    vector<vector<int>> binaryTreePathSum(TreeNode *root, int target) {
        vector<int>v;
        int s=0;
        find(root,target,v,s);
        return P;
    }
         void find(TreeNode *root,int target,vector<int>v,int s)
        {
            if(root!=NULL)
            {
                v.push_back(root->val);
                s=s+root->val;
            
            if(s==target&&root->left==NULL&&root->right==NULL)
            {
                P.push_back(v);
            }
            if(root->left!=NULL)
            {
                find(root->left,target,v,s);
            }
            if(root->right!=NULL)
            {
                find(root->right,target,v,s);
            }
            s=s-root->val;
            v.pop_back();
        }
    }

};

感悟:

一开始分别采用递归和非递归的方法做了一下该题,但努力了很久都没有将该题做出来,原因主要在与没有将删除路径上的结点处理好。后来参考了别人的答案才将该题做出。

还需思考用非递归的方法如何处理删除结点的问题。

0 0
原创粉丝点击