原創文章,轉載請注明出處!
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.測試用例
- 空指針
- 二叉樹中沒有符合條件的路徑
- 二叉樹中有一條符合條件的路徑
- 二叉樹中有多條符合條件的路徑