#剑指Offer36.二叉搜索树与双向链表
/*
// Definition for a Node.
class Node {
public:
int val;
Node* left;
Node* right;
Node() {}
Node(int _val) {
val = _val;
left = NULL;
right = NULL;
}
Node(int _val, Node* _left, Node* _right) {
val = _val;
left = _left;
right = _right;
}
};
*/
class Solution {
public:
Node* treeToDoublyList(Node* root) {
if(root==NULL){
return root;
}
Node *head=nullptr;
Node *pre=nullptr;
DFS(root,head,pre);
//最后把链表首尾连接上
head->left=pre;
pre->right=head;
return head;
}
private:
void DFS(Node *node,Node* &head,Node* &pre){
//当前点是空得直接返回
if(!node) return;
//把左子树变成链表
DFS(node->left,head,pre);
//如果左子树空得则当前结点是链表头
if(head==NULL){
head=node;
pre=node;
}//否则把左子树生成得链表连到当前结点上
else{
pre->right=node;
node->left=pre;
pre=node;
}
//把右子树变成链表
DFS(node->right,head,pre);
}
};
#剑指Offer31.栈得压入、弹出序列
class Solution {
public:
bool validateStackSequences(vector<int>& pushed, vector<int>& popped) {
if(pushed.size()<2){
return true;
}
stack<int> data;
int j=0;
for(int i=0;i<pushed.size();i++){
data.push(pushed[i]);
while(!data.empty() && data.top()==popped[j] ){
data.pop();
j++;
}
}
return data.empty();
}
};