棧的壓入、彈出序列
題目描述
輸入兩個整數序列,第一個序列表示棧的壓入順序,請判斷第二個序列是否可能爲該棧的彈出順序。假設壓入棧的所有數字均不相等。例如序列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;
}
};