题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{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];
}
}
};