输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但
4,3,5,1,2就不可能是该压栈序列的弹出序列.(注意:这两个序列的长度是相等的)
解题思路:
1.如果当前栈顶元素和出栈序列现在指向的元素不相同 或者栈为空
-> 就要一直进栈,直到当前栈顶元素和出现序列现在指向的元素相同
2.如果当前栈顶元素和出栈序列现在指向的元素相同
->出栈序列往后走,弹出栈顶元素,继续比较 (要保证:栈不为空&&栈顶元素==当前出栈序列指向的元素)

class Solution {
public:
bool IsPopOrder(vector<int> pushV,vector<int> popV)
{
//先做特殊性判定
if(pushV.empty() || popV.empty() || popV.size() != pushV.size())
{
return false;
}
//遍历入栈序列
stack<int> st;
int j = 0;
for(int i = 0;i<pushV.size();i++)
{
st.push(pushV[i]);//把当前入栈序列元素入栈
//模拟栈的入栈和出栈序列
//如果栈不为空 && 当前栈顶元素==出栈元素,就一直往后比较出栈序列的元素
//如果该条件不满足,就要一直入栈
//如果该条件满足,就要一直出栈
//pushV代表对应的入栈逻辑,popV代表对应的出栈逻辑
while(!st.empty() && st.top() == popV[j])
{
j++;
st.pop();//去掉栈顶元素,比较下一个元素
}
}
//如果最后栈为空,说明第二个序列是该栈的弹出顺序
return st.empty();
}
};
从上往下打印出二叉树的每个节点,同层节点从左至右打印
本质是层序遍历
class Solution {
public:
vector<int> PrintFromTopToBottom(TreeNode* root) {
vector<int> v;
if(root==nullptr)
{
return v;//返回空容器
}
queue<TreeNode*> q;//用于层序遍历
q.push(root);
while(!q.empty())
{
TreeNode* node = q.front();
q.pop();
v.push_back(node->val);//把当前节点的值放到容器中
//处理左右孩子入队列
if(node->left) q.push(node->left);
if(node->right) q.push(node->right);
}
return v;
}
};