21栈的压入、弹出序列
这题有个解题思路即仿真弹出序列,先向一个栈里面不断的插入元素,然后对比输出栈开始弹出元素,若弹出的容器中的值和popV栈中的值不同即代表不是弹出序列。
class Solution {
public:
bool IsPopOrder(vector<int> pushV,vector<int> popV) {
if(pushV.size()!=popV.size()&&pushV.empty()&&popV.empty())
return false;
stack<int> st;
vector<int> answer;
for(int i=0,j=0;j<popV.size();){
while(st.empty()||st.top()!=popV[j]){
st.push(pushV[i]);
++i;
}
if(st.top()==popV[j]){
answer.push_back(st.top());
st.pop();
++j;
}
}
for(int i=0;i<answer.size();i++){
if(answer[i]!=popV[i])
return false;
}
return true;
}
};
先编了这个,然后发现只能够通过33%的例子,其主要原因是因为,它只能够通过对的例子,当需要返回false时,由于判断条件时if(st.top()==popV[j])所以当不对的时候j永远不会增加,陷入死循环。。。所以正确判断如下:
class Solution {
public:
bool IsPopOrder(vector<int> pushV,vector<int> popV) {
if(pushV.size()!=popV.size()&&pushV.empty()&&popV.empty())
return false;
stack<int> st;
vector<int> answer;
int j=0;
for(int i=0;j<popV.size();){
while(st.empty()||st.top()!=popV[j]){
st.push(pushV[i]);
++i;
}
if(st.top()!=popV[j])
break;
st.pop();
++j;
}
if(st.empty()&&j==popV.size())
return true;
return false;
}
};
22 从上往下打印二叉树
通过队列存储节点来达到将各个节点输入到answer容器中的目的,原来想的是通过遍历的方法,然而还是队列从结果到过程感觉都要优越一点。代码如下:
class Solution {
public:
vector<int> PrintFromTopToBottom(TreeNode* root) {
vector<int> answer;
if(!root)
return answer;
deque<TreeNode*> que;
que.push_back(root);
while(!que.empty()){
TreeNode* rot=que.front();
que.pop_front();
answer.push_back(rot->val);
if(rot->left)
que.push_back(rot->left);
if(rot->right)
que.push_back(rot->right);
}
return answer;
}
};
23 二叉搜索树的后序遍历序列
该题先需要知道在后序遍历中,根节点的值是最后一个,而在二叉搜索树中,其左子树的值一定小于根值,右子树一定大于根值。所以若在其右子树出现小于根值得情况即不为后序遍历得解。先通过遍历分别出其左子树和右子树,然后递归判断。代码如下:
class Solution {
public:
bool VerifySquenceOfBST(vector<int> sequence) {
int length=sequence.size()-1;
if(sequence.empty())
return false;
int i=0;
int root=sequence[length];
vector<int> left;
for(;sequence[i]<root;++i){
left.push_back(sequence[i]);
}
int j=i;
vector<int> right;
for(;j<length;++j){
if(sequence[j]<root)
return false;
right.push_back(sequence[j]);
}
bool left1=true;
if(i>0)
left1=VerifySquenceOfBST(left);
bool right1=true;
if(i<length)
right1=VerifySquenceOfBST(right);
return left1&&right1;
}
};