开宗明义:本系列基于牛客网剑指offer,刷题小白,一天两道我快乐!旨在理解和交流,重在记录,望各位大牛指点!
牛客网-剑指offer
1、栈的压入、弹出序列
描述:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如压入栈的顺序为1,2,3,4,5,那么系列4,5,3,2,1就是该压栈序列对应的一个弹出序列,而4,3,5,1,2就不是该压栈序列的弹出序列。
思路:借用辅助栈,遍历压栈顺序,先讲第一个放入栈中,这里是1,然后判断栈顶元素是不是出栈顺序的第一个元素,这里是4,很显然1≠4,所以我们继续压栈,直到相等以后开始出栈,出栈一个元素,则将出栈顺序向后移动一位,直到不相等,这样循环等压栈顺序遍历完成,如果辅助栈还不为空,说明弹出序列不是该栈的弹出顺序。
测试代码:
#include <stack>
#include <vector>
using namespace std;
class Solution {
bool lsPopoOrder(vector<int> pushV, vector<int> popV) { //一个压栈顺序,一个出栈顺序
//如果压入栈为空,返回false
if (pushV.size() == 0) {
return false;
}
//
vector<int> stack;
//vector是先进先出,假设入栈的为1,2,3,4,5
for (int i = 0, j = 0; i < pushV.size();) {
stack.push_back(pushV[i++]); //stack此时为1
while (j < popV.size() && stack.back() == popV[j]) {
stack.pop_back();
j++;
}
}
return stack.empty();
}
};
2、从上往下打印二叉树
描述:从上往下打印出二叉树的每个节点,同层节点从左往右打印。
思路:二叉树的层次遍历,借助一个队列。
测试代码:
#include <stdio.h>
#include <vector>
#include <queue>
using namespace std;
struct TreeNode{
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x):val(x),left(NULL),right(NULL){}
};
class Solution {
public:
vector<int> PrintFromTopToBottom(TreeNode* root) {
vector<int> result;
//为空时,赋值为空
if (root == NULL) {
return result;
}
//
queue<TreeNode *>Q;
Q.push(root);
//
while (!Q.empty()){
for (int i = 0; i < Q.size(); i++) {
TreeNode *node = Q.front();
Q.pop();
//消去Q
//前序遍历
result.push_back(node->val);
//
if (node->left) {
Q.push(node->left);
}
if (node->right) {
Q.push(node->right);
}
}
}
return result;
}
};