資料結構與演算法面試題80道

2021-08-04 06:44:25 字數 2857 閱讀 2649

問題分析:二叉查詢樹是一種二叉樹的結構,其中,根節點的值大於左子樹的值,小於右子樹的值。而二叉查詢樹的中序遍歷即為排序的結果。對於根節點,前驅指標指向左子樹中最大的節點,同理,後驅指標指向右子樹中最小的節點,如下圖所示:

樹是一種遞迴的結果,因此,對於左右子樹,也需要執行相同的操作。

方法:

bstreenode* convert(bstreenode *root)

問題分析:棧的特點是先進後出。要能夠取出當前的最小值,需要用另乙個棧儲存當前的最小值,所以可採用「雙棧」的結構,乙個棧儲存所有的值,另乙個棧儲存當前的最小值。

方法:

template

問題分析:在陣列的每乙個位置處儲存當前的最大值,當前的最大值組成為:

f(xi)

= int *p_h_a = (int *)malloc(sizeof(int) * length);

// 遍歷陣列

問題分析:核心是樹的遍歷,注意題目中「路徑」的定義,是從根節點到葉子節點。先序遍歷正好是從根節點開始,因此可以利用先序遍歷的過程來實現這個過程。

方法:

void print_vector(vector

問題分析:這是一道比較經典的題目,查詢最小的k個元素,最簡單的方法就是對這n個整數排序,排序完成後,直接輸出前k個最小的元素。那麼最快的排序方法是快速排序,其演算法的時間複雜度為o(nlogn)。是否還存在比這個更快的方法呢?

方法一:利用快速排序的思想,時間複雜度為o(n)

按照某個點將陣列劃分成左右兩部分,左邊的數都小於該劃分節點,右邊的數都大於該劃分節點。如果最終該劃分節點的位置小於k-1,則在右邊節點中繼續劃分;如果最終該劃分節點的位置大於k-1,則在左邊節點中繼續劃分。這個過程直到最終的劃分節點的位置正好為k-1。

int swap(int *a, int start, int end, int point_index)else

if(a[start] < par_point)else

}return start;

}void get_min_k(int *a, int

length, int k)else}}

方法二:利用堆排序,時間複雜度為o(nlogk)

上述方法的缺點是其對陣列進行了修改,在堆排序中,可採用小頂堆,其中堆的大小為k,若此時堆的大小小於k時,則將數插入堆中;若此時堆中的大小大於等於k,則比較堆中最大的整數與待插入整數的大小,插入較小的整數。

void get_min_k(int *a, int length, int k, set

&s)else}}

}

資料結構與演算法面試題80道(23)

第23題 演算法 用最簡單,最快速的方法計算出下面這個圓形是否和正方形相交。3d座標系 原點 0.0,0.0,0.0 圓形 半徑r 3.0 圓心o 0.0,正方形 4個角座標 1 0.0,2 0.0,3 0.0,4 0.0,沒搞懂座標給的是什麼意思,表示座標的值?也不清楚圓和正方形是不是實心。如果是...

資料結構與演算法面試題80道(19)

第19題 題目 定義 fibonacci 數列如下 0 n 0 f n 1 n 1 f n 1 f n 2 n 2 輸入n,用最快的方法求該數列的第n項。分析 在很多 c語言教科書中講到遞迴函式的時候,都會用 fibonacci 作為例子。因此很多程式設計師對這道題的遞迴解法非常熟悉,但.呵呵,你知...

資料結構與演算法面試題

1。計算二叉樹的深度 獲取最大深度 public static intgetmaxdepth treenode root 2。折半查詢 非遞迴 package althorgrim 1 必須採用順序儲存結果 2 關鍵字必須有序 author hanrk 2734 public class testb...