【劍指offer】面試題25:二叉樹中和爲某一值的路徑

題目:輸入一棵二叉樹和一個整數,打印出二叉樹中結點值的和爲輸入整數的所有路徑。從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。二叉樹結點的定義如下:

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掉
    }
}
發佈了105 篇原創文章 · 獲贊 159 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章