【劍指offer{4-6}】重建二叉樹、用兩個棧實現佇列、旋轉陣列的最小數字
阿新 • • 發佈:2018-12-26
重建二叉樹、用兩個棧實現佇列、旋轉陣列的最小數字
重建二叉樹
題目描述
- 輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6},則重建二叉樹並返回。
C++程式碼
/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) { int preLen = pre.size(); int vinLen = vin.size(); if(preLen==0 || vinLen==0 || preLen!=vinLen) { return NULL; } TreeNode *head = new TreeNode(pre[0]); int index = 0; vector<int>preLeft,preRight,vinLeft,vinRight; for(int i = 0;i<vinLen;i++) { if(vin[i]==pre[0]) { index = i; break; } vinLeft.push_back(vin[i]); } for(int j = 1;j<=index;j++) { preLeft.push_back(pre[j]); } for(int k = index+1;k<vinLen;k++) { preRight.push_back(pre[k]); vinRight.push_back(vin[k]); } head->left = reConstructBinaryTree(preLeft,vinLeft); head->right = reConstructBinaryTree(preRight,vinRight); return head; } };
用兩個棧實現佇列
題目描述
- 用兩個棧來實現一個佇列,完成佇列的Push和Pop操作。 佇列中的元素為int型別。
C++程式碼
class Solution { public: void push(int node) { stack1.push(node); } int pop() { if(stack2.empty()) { while(!stack1.empty()) { int data = stack1.top(); stack1.pop(); stack2.push(data); } } int value = stack2.top(); stack2.pop(); return value; } private: stack<int> stack1; stack<int> stack2; };
旋轉陣列的最小數字
題目描述
- 把一個數組最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。 輸入一個非減排序的陣列的一個旋轉,輸出旋轉陣列的最小元素。 例如陣列{3,4,5,1,2}為{1,2,3,4,5}的一個旋轉,該陣列的最小值為1。 NOTE:給出的所有元素都大於0,若陣列大小為0,請返回0。
C++程式碼
class Solution { public: int minNumberInRotateArray(vector<int> rotateArray) { if(rotateArray.size()==0) { return 0; } int start = rotateArray[0]; int len = rotateArray.size(); for(int i = 1;i<len;i++) { if(rotateArray[i-1]>rotateArray[i]) { return rotateArray[i]; } } return start; } };