題目:輸入一棵二叉樹和一個整數,打印出二叉樹中結點值的和爲輸入整數的所有路徑。從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。二叉樹結點的定義如下:
struct BinaryTreeNode{
int value;
BinaryTreeNode* left;
BinaryTreeNode* right;
};
想法:
先理解路徑,就是樹根到葉子節點的條路,那我們先實現出打印出路徑的函數:
vector<int> v;
void FindPath(BinaryTreeNode* root) {
if (root) {
v.push_back(root->value);
if (!root->left && !root->right) { //到葉子結點
for (int i = 0; i < v.size(); i ++) {
cout << v[i] << " ";
}
cout << endl;
v.pop_back();
return;
}
if (root->left)
FindPath(root->left);
if (root->right)
FindPath(root->right);
v.pop_back(); //訪問過該節點,就pop掉
}
}
然後再想辦法加入一個current變量記錄當前的和,主要是爲了剪枝:
如果中途(還沒有到葉子節點)我們的current就已經比目標值sum大(或者相等)的話,就不必去訪問該節點的葉子節點了。
vector<int> v;
int current = 0;
void FindPath(BinaryTreeNode* root, int sum) {
if (sum <= 0) return;
if (root) {
v.push_back(root->value);
current += root->value;
if (!root->left && !root->right) { //到葉子結點
if (current == sum) {
for (int i = 0; i < v.size(); i ++) {
cout << v[i] << " ";
}
cout << endl;
}
current -= root->value;
v.pop_back();
return;
}
//剪枝
if (current >= sum) {
current -= root->value;
v.pop_back();
return;
}
if (root->left)
FindPath(root->left, sum);
if (root->right)
FindPath(root->right, sum);
current -= root->value;
v.pop_back(); //訪問過該節點,就pop掉
}
}