題目描述
輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6},則重建二叉樹並返回。
題目類別
樹
解題思路
一開始的思路是從前向後比較,直到出現遞減。但是還可以用二分查找解決此類問題
取中間值,並設置兩端的index,中間值大於左邊的index,那麼就將左邊的index設置爲中間值,向遞增尾端移動,反之設置右邊的index,向遞減前端移動,最終兩個index相差爲1的時候,就找到了最小值,時間複雜度爲O(logn)
注意問題:
1 當數組旋轉0時,最左邊元素小於最右邊元素,這也就是indexMid最開始值爲index1
2.當左端值和中間值和右端值相等時。無法判斷數字是位於前面範圍還是後面範圍,因此退化爲O(n)複雜度算法
具體實現
class Solution {
public:
mberInRotateArray(vector<int> rotateArray) {
int index1 = 0;
int index2 = rotateArray.size()-1;
int indexMid = index1;
while(rotateArray[index1] >= rotateArray[index2]){
indexMid = (index1+index2)/2;
if(rotateArray[index1]== rotateArray[indexMid] &&
rotateArray[index2]== rotateArray[indexMid] )
return Min(rotateArray, index1, index2);
if(index2-index1 == 1){
indexMid = index2;
break;
}
if(rotateArray[indexMid] >= rotateArray[index1])
index1 = indexMid;
else
index2 = indexMid;
}
return rotateArray[indexMid];
}
int Min (vector<int> rotateArray,int l,int r){
for( int i = l; i < r ; i++){
if(rotateArray[i] > rotateArray[i+1])
return rotateArray[i+1];
}
}
};