- 题目描述:
输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
- 剑指Offer书上代码:
void FindPath(BinaryTreeNode* pRoot, int expectedSum, vector<int>& path, int& currentSum){
currentSum += pRoot->m_nValue;
path.push_back(pRoot->m_nValue);
//如果是叶节点,并且路径上节点的和等于输入的值
//打印出这条路径
bool isLeaf = pRoot->m_pLeft == NULL && pRoot->m_pRight == NULL;
if (currentSum == expectedSum && isLeaf){
printf("A path is found:");
vector<int>::iterator iter = path.begin();
for (; iter != path.end(); ++iter)
printf("%d\t", *iter);
printf("\n");
}
//如果不是叶节点,则遍历它的子节点
if (pRoot->m_pLeft != NULL)
FindPath(pRoot->m_pLeft, expectedSum, path, currentSum);
if (pRoot->m_pRight != NULL)
FindPath(pRoot->m_pRight, expectedSum, path, currentSum);
//在返回到父节点之前,在路径上删除当前节点
//并在currentSum中减去当前节点的值
currentSum -= pRoot->m_nValue;
path.pop_back();
}
void FindPath(BinaryTreeNode* pRoot, int expectedSum){
if (pRoot == NULL)
return;
vector<int> path;
int currentSum = 0;
FindPath(pRoot, expectedSum, path, currentSum);
}
- AC的代码:
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
void FindPath(TreeNode* pRoot, int expectedSum, vector<int>& path, int& currentSum,vector<vector<int>>& result){
currentSum += pRoot->val;
path.push_back(pRoot->val);
bool isLeaf = pRoot->left == NULL && pRoot->right == NULL;
if (currentSum == expectedSum && isLeaf){
vector<int>replace;
vector<int>::iterator iter = path.begin();
for (; iter != path.end(); ++iter)
replace.push_back(*iter);
result.push_back(replace);
replace.clear();
}
if (pRoot->left != NULL)
FindPath(pRoot->left, expectedSum, path, currentSum,result);
if (pRoot->right != NULL)
FindPath(pRoot->right, expectedSum, path, currentSum,result);
currentSum -= pRoot->val;
path.pop_back();
}
vector<vector<int> > FindPath(TreeNode* root,int expectNumber) {
vector<vector<int>> result;
if (root == NULL)
return result;
vector<int> path;
int currentSum = 0;
FindPath(root, expectNumber, path, currentSum,result);
return result;
}
};
- 总结:
首先,这道题的思路不好想出来,我是在看了书上的代码后才懂的。
其次,学会了vector
//这种用法之前还没有遇到过,需注意!
vector<int>replace;
vector<int>::iterator iter = path.begin();
for (; iter != path.end(); ++iter)
replace.push_back(*iter);
result.push_back(replace);
replace.clear();