原創文章,轉載請注明出處!
1.題目
輸入一顆二叉樹和一個整數,打印出二叉樹中結點值的和為輸入整數的所有路徑。路徑由結點和有向邊組成,從根結點到葉節點。
// 二叉樹結點的定義
struct BinaryTreeNode
{
int val;
BinaryTreeNode *left;
BinaryTreeNode *right;
}
舉例:

二叉樹中有兩條和為22的路徑:{10,5,7}和{10,12}
2.思路
本題使用前序遍歷的方式訪問節點,使用二維向量result存儲全部路徑,使用一維向量tmp存儲當前路徑。遍歷二叉樹的過程:按前序遍歷順序訪問每一個節點。訪問每個結點時,將結點添加到路徑向量tmp中。如果當前結點是葉子結點,則判斷當前路徑是否是符合條件的路徑,符合條件的路徑存入到二維向量result;如果當前結點不是葉子結點,則遞歸當前節點的左右子節點。舉例:

3.代碼
class Solution {
public:
vector<vector<int> > FindPath(TreeNode* root,int expectNumber)
{
if(root) dfsFind(root, expectNumber);
return allRes;
}
void dfsFind(TreeNode * node , int target)
{
tmp.push_back(node->val);
if(!node->left && !node->right)
{
if(target - node->val == 0)
allRes.push_back(tmp);
}
else
{
if(node->left) dfsFind(node->left, target - node->val);
if(node->right) dfsFind(node->right, target - node->val);
}
if(!tmp.empty())
tmp.pop_back();
}
private:
vector<vector<int> >allRes;
vector<int> tmp;
};
4.測試用例
- 空指針
- 二叉樹中沒有符合條件的路徑
- 二叉樹中有一條符合條件的路徑
- 二叉樹中有多條符合條件的路徑
