5.13打卡:劍指 offer兩題:二叉搜索樹的後序遍歷序列/二叉樹中和爲某一值的路徑

二叉搜索樹的後序遍歷序列

題目描述

輸入一個非空整數數組,判斷該數組是不是某二叉搜索樹的後序遍歷的結果。如果是則輸出Yes,否則輸出No。假設輸入的數組的任意兩個數字都互不相同。

思路:二叉樹的後序遍歷數組有着什麼的特點?

特點:遍歷的時候,如果遇到比最後一個元素大的節點,就說明它的前面都比最後一個元素小,該元素後面的所有值都必須大於最後一個值,這兩個條件必須都要滿足。否則就說明該序列不是二叉樹後序遍歷。
例子: 2 4 3 6 8 7 5 這是一個正確的後序遍歷
這個例子的特點就是:最後一個元素是 5 ,首先遍歷數組,當遍歷到6的時候,6前面的值都小於5,如果在6後面的值有一個小於5就不是後序遍歷,所以一旦在遍歷的時候遇到比最後一個元素的值索引,那麼之後的所有元素都必須大於5,否則就不是後序遍歷序列。

class Solution {
public:
    bool VerifySquenceOfBST(vector<int> sequence) {
        if(sequence.size() == 0) return false;
        int sum = sequence.size() - 1;
        int count = 0;
        while(sum)
        {
            while(sequence[count] < sequence[sum]) ++ count;
            while(sequence[count] > sequence[sum]) ++ count;
            if(count < sum) return false;
            --sum;
            count = 0;
        }
        return true;
    }
};

二叉樹中和爲某一值的路徑

題目描述

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

思路:
(1)首先該題是基於遞歸去遍歷整棵樹,遍歷完每一條路徑,遍歷的順序是先根節點,然後是左節點,接着是右節點;
(2)如果節點的左右子樹都爲空,且路徑之和等於參數,就說明該路徑是需要輸出的
(3)如果不滿足條件,在遍歷完之後需要把最後一顆節點彈出來。

class Solution {
public:
    void def(TreeNode* root, int expectNumber)
    {
        temp.push_back(root->val);
        if(expectNumber - root->val == 0 && root->left==nullptr && root->right == nullptr)
        {
            ret.push_back(temp);
        }
        else
        {
            if(root->left != nullptr) def(root->left, expectNumber - root->val);
            if(root->right != nullptr) def(root->right, expectNumber - root->val);
        }
        temp.pop_back();
    }
    vector<vector<int> > FindPath(TreeNode* root,int expectNumber) {
        if(root == nullptr) return ret;
        def(root, expectNumber);
        return ret;
    }
private:
    vector<vector<int>>ret;
    vector<int>temp;
};

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章