資料結構經典例題解析C/C++程式碼實現(二)
阿新 • • 發佈:2018-11-12
第一題
題目
編一C程式,它能把讀入的整數依次插入到一個初始為空的二叉排序樹中,一直讀到
-9999
為止(-9999
不插入該二叉排序樹)。輸出該二叉排序樹的前序序列、後序序列及葉結點的個數。(輸入時,兩個相鄰的整數用空格隔開)。
解析
這個程式碼可以參考二叉樹的遍歷和二叉樹前序、中序、後序遍歷的非遞迴寫法。
第二題
題目
編一C程式,它能對輸入的一串整數(不多於
1000
個,以-9999
為結束標記)到陣列a
中,再對a
的元素進行直接插入排序(從小到大排序),輸出排序結果和所用關鍵字比較次數。(輸入時,兩個相鄰的整數用空格隔開)。
解析
插入排序,這個要好好看看,很多排序演算法,例如希爾排序,堆排序等等都是依賴於插入排序。
更詳細的程式碼可以參考插入排序。
C語言
#define END -9999
#define MAX_SIZE 1005
int array[MAX_SIZE], n;
int cnt;
void InsertSort()
{
int i, j, k, tmp;
for (cnt = 0, i = 1; i < n; ++i) {
for (j = i - 1; j >= 0 && array[j] > array[i]; ++ cnt, --j) {}
tmp = array[i];
for (k = i; k > j + 1; array[k] = array[k - 1], --k) {}
array[j + 1] = tmp;
}
}
int main()
{
int x;
for (n = 0; scanf("%d", &x) && x != END; array[n++] = x) {}
InsertSort();
printf("%d\n", cnt);
for (x = 0; x < n; printf("%d%c", array[x], " \n"[x + 1 == n]), ++x) {}
return 0;
}