您的位置:首页 > 职场人生

面试题 25:二叉树中和为某一值的路径

2017-09-05 18:32 316 查看
题目描述:给定一个二叉树,找出所有路径中各节点相加总和等于给定 目标值 的路径。一个有效的路径,指的是从根节点到叶节点的路径。

今天一直被这道题困扰,思路很简单,递归去判断这个要求的和是否和已经走到的这个结点的值相比,如果相等那么一条路径找到,然后再去寻找其他可能存在的路径,直到我们访问到叶子结点为止。

思路很明确,但写代码这个过程还是费了九牛二虎之力,因为有好多问题。其实反过来也说明对这个过程并没有理解清楚。

先给出二叉树的结构:

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


很明显,现在这个问题是用递归去实现的,不断地找通过累加找那个我们访问到的结点的val。好,下一步,我们来整理下整个问题,假如现在的值已经相等,那么我们需要判断当前结点是否是叶子结点,如果是叶子结点已经找到了一条符合要求的路径,可以将这个路径保存下来了;反之再去访问当前结点的左右孩子结点……按照这个想法,可以写出代码如下。

/**
* 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>> res;
vector<int> path;
vector<vector<int>> binaryTreePathSum(TreeNode *root, int target) {
// Write your code here
if(root==NULL) return res;
path.push_back(root->val);

if(target==root->val && root->left==NULL && root->right==NULL)
res.push_back(path);

if(root->left)
binaryTreePathSum(root->left,target-root->val);
if(root->right)
binaryTreePathSum(root->right,target-root->val);

if(path.size()!=0) path.pop_back();

return res;
}
};


问题理解的关键在于每次按照一条路径去查找,不管合不合适的时候,最后会将这个父节点pop出来,在重新找出新的路径。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: