您的位置:首页 > Web前端

剑指offer(13)-二叉树中和为某一值的路径

2016-10-23 22:09 393 查看
题目:输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。二叉树结点的定义如下:

struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};


解决题目的关键是在进行前序遍历时记录下遍历过的结点,并且在找到满足条件的一条路径后将当前结点删除,很明显需要使用栈或者用其它方式模拟栈。

class Solution {
public:
vector<vector<int> > FindPath(TreeNode* root,int expectNumber) {
vector<vector<int> > pathAll;
if (root == NULL)
return pathAll;
vector<int> path;
int currentSum = 0;
FindPath(root,expectNumber,path,currentSum,pathAll);
return pathAll;
}

void FindPath(TreeNode* pRoot,int expectNumber,vector<int> &path,int currentSum,vector<vector<int> > &pathAll2){
currentSum += pRoot->val;
path.push_back(pRoot->val);
bool isLeaf = (pRoot->left == NULL) && (pRoot->right == NULL);
if (currentSum == expectNumber && isLeaf)
{
pathAll2.push_back(path);

}
if (pRoot->left != NULL){
FindPath(pRoot->left,expectNumber,path,currentSum,pathAll2);
}
if (pRoot->right != NULL){
FindPath(pRoot->right,expectNumber,path,currentSum,pathAll2);
}

path.pop_back();
}

};


Leetcode上的变形题目:

112. Path Sum

Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up all the values along the path equals the given sum.

For example:

Given the below binary tree and sum = 22, 5

/ \

4 8

/ / \

11 13 4

/ \ \

7 2 1

return true, as there exist a root-to-leaf path 5->4->11->2 which sum is 22.

class Solution {
public:
bool PathSum(TreeNode* node, int CurrentNumber, int sum)
{
if (node == NULL)
return false;
if (node->left == NULL && node->right == NULL)
return CurrentNumber + node->val == sum;
return PathSum(node->left, CurrentNumber + node->val, sum) || PathSum(node->right, CurrentNumber + node->val, sum);

}

bool hasPathSum(TreeNode* root, int sum) {
return PathSum(root, 0, sum);
}

};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: