JZ21 栈的压入、弹出序列(好好想想)
题目
代码
class Solution {
public:
bool IsPopOrder(vector<int> pushV,vector<int> popV) {
if(pushV.empty() || popV.empty() || pushV.size()!=popV.size()){
return false;
}
/* 使用一个栈遍历入栈序列
* 然后在出栈序列中寻找当前的序号 如果找到 则出栈
弹出栈的元素 一定先入栈
*/
stack<int> s;
int i=0, j=0;
while(i<pushV.size()){ // 遍历入栈序列
s.push(pushV[i]); // 进栈
i++;
while (!s.empty() && s.top()==popV[j]){ // 比较s和popV
// 如果在出栈序列中找到
s.pop(); // 弹出
j++;
}
}
// 遍历完入栈序列后 如果s中还有元素 说明不匹配
return s.empty();
}
};
JZ22 从上往下打印二叉树
题目
知识
这道题需要使用队列来解决
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。
先进先出
代码
// 总的来说
// 就是通过队列的性质 将二叉树按照从上到下、从左到右的节点
// 放入队列中
/*
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) {
vector<int> result;
if(!root) return result;
// 利用队列先进先出的性质 将root push进队列中
queue<TreeNode*> q;
q.push(root); // 将根节点放进去
while(!q.empty()){
TreeNode* node = q.front(); // 取队列头 即二叉树中先放入的数据
q.pop(); // quchu1
result.push_back(node->val);
// 一层一层地放 先进先出
if(node->left) q.push(node->left);
if(node->right) q.push(node->right);
}
return result;
}
};
JZ23 二叉搜索树的后序遍历序列
题目
知识
二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。