5.12打卡:劍指 offer兩題:棧的壓入、彈出序列/從上往下打印二叉樹節點

棧的壓入、彈出序列

題目描述

輸入兩個整數序列,第一個序列表示棧的壓入順序,請判斷第二個序列是否可能爲該棧的彈出順序。假設壓入棧的所有數字均不相等。例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序列對應的一個彈出序列,但4,3,5,1,2就不可能是該壓棧序列的彈出序列。(注意:這兩個序列的長度是相等的)

class Solution {
public:
    bool IsPopOrder(vector<int> pushV,vector<int> popV) {
        if (pushV.size() != popV.size()) return false;
        stack<int> stk; //定義一個棧
        int i = 0; //定義第i個棧
        for (auto x : pushV) { //枚舉pushV當中的每一個數
            stk.push(x); //插入x
            while (stk.size() && stk.top() == popV[i]) { 
                stk.pop(); //一樣則將當前棧頂元素彈出,不一樣則繼續枚舉,並將x插入棧
                i ++;
            }
        }
        return stk.empty(); //stk.empty()表示,爲空則爲真,不空則爲假
    }
};

從上往下打印二叉樹節點

題目描述

從上往下打印出二叉樹的每個節點,同層節點從左至右打印。

/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};*/
class Solution {
public:
    //廣度優先遍歷用隊列
    //深度優先遍歷用棧
    //從左至右打印樹的每個節點,顯然用廣度優先遍歷
    vector<int> PrintFromTopToBottom(TreeNode* root) {

        queue<TreeNode* >  q;
        vector<int> res;

        //如果爲空直接返回res, 不能直接返回NULL
        //因爲返回值類型是vector<int>, 不是指針類型
        if(root==NULL)
            return res;

        q.push(root);
        while(!q.empty())
        {
            //每次從對列頭部取節點
            TreeNode* tmp = q.front();
            res.push_back(tmp->val);
            q.pop();

            //將左節點壓入隊列
            if(tmp->left!=NULL)
                q.push(tmp->left);
            //將右節點壓入隊列
            if(tmp->right!=NULL)
                q.push(tmp->right);
        }
        return res;
    }
};

 

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