4.重建二叉樹
解題思路:先根據前序遍歷的第一個元素就是二叉樹的根節點,再根據中序遍歷根節點的左邊就是二叉樹的左子樹的結點,根節點的右邊就是二叉樹的右邊可以將一棵樹劃分成兩顆子樹,重複這個步驟,直到它的左右子樹都爲空爲止。
class Solution {
public:
TreeNode* reCreateTree(vector<int> pre,vector<int> vin,int preL,int preR,int vinL,int vinR)
{
//用preL,preR來記錄前序遍歷數組的範圍
//用vinL,vinR來記錄中序遍歷數組的範圍
//設置遞歸結束條件
if(preL > preR || vinL > vinR) return NULL;
//先序遍歷的開頭就相當於是子樹的根節點
TreeNode* root = new TreeNode(pre[preL]);
//在中序遍歷當中遍歷,找到該節點的位置,可以劃分新的兩顆子樹
//preL+1~preL+i爲前序遍歷中的新的左子樹,vinL~i-1爲中序遍歷中的新的左子樹
//preL+i+1-vinL~preR前先序遍歷中的新的右子樹,i+1~vinR爲中序遍歷中的新的右子樹
for(int i=vinL; i<=vinR; i++)
{
if(vin[i] == pre[preL])
{
root->left = reCreateTree(pre,vin,preL+1,preL+i,vinL,i-1);
root->right = reCreateTree(pre,vin,preL+i+1-vinL,preR,i+1,vinR);
break;
}
}
return root;
}
TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
int preL = 0,preR = pre.size()-1,vinL = 0,vinR = pre.size()-1;
return reCreateTree(pre,vin,preL,preR,vinL,vinR);
}
};
5.用兩個棧實現隊列
解題思路:太簡單了~~。入隊就跟入棧一樣,出隊如果棧2不爲空則直接出棧2,如果棧2爲空則將棧1壓入棧2在出棧。如果兩個棧都爲空則出隊失敗。
class Solution
{
public:
void push(int node) {
stack1.push(node);
}
int pop() {
int a;
if(stack2.empty())
{
while(!stack1.empty())
{
stack2.push(stack1.top());
stack1.pop();
}
}
a = stack2.top();
stack2.pop();
return a;
}
private:
stack<int> stack1;
stack<int> stack2;
};
6.旋轉數組中最小的數
解題思路:說實話題目都沒看明白,只知道要找最小的數,沒想到從頭到尾遍歷一遍居然給過了。。。
class Solution {
public:
int minNumberInRotateArray(vector<int> rotateArray) {
if(rotateArray.size() == 0) return 0;
int min = rotateArray[0];
for(int i=1; i<rotateArray.size(); i++)
{
if(min > rotateArray[i]) min = rotateArray[i];
}
return min;
}
};