数据结构与算法分析——c语言描述 练习4.44 答案
用了以前的生成前N个自然数的一个随机置换代码。
tree.h
typedef int ElementType; #ifndef _Tree_H #define _Tree_H struct TreeNode; typedef struct TreeNode *Position; typedef struct TreeNode *SearchTree; void makeEmpty(SearchTree t); Position find(ElementType X, SearchTree t); Position findMin(SearchTree t); Position findMax(SearchTree t); SearchTree insert(ElementType X, SearchTree t); SearchTree Delete(ElementType X, SearchTree t); ElementType Retrieve(Position p); Position findKth(SearchTree t, int i); #endif
#include"tree.h" #include"fatal.h" struct TreeNode { ElementType element; SearchTree left; SearchTree right; int size; }; void makeEmpty(SearchTree t) { if (t) { makeEmpty(t->left); makeEmpty(t->right); free(t); } } Position find(ElementType X, SearchTree t) { if (t == NULL) return NULL;//NOT FOUND else { if (X < t->element) return find(X, t->left); else if (X>t->element) return find(X, t->right); else return t; } } Position findMin(SearchTree t) { while (t->left) t = t->left; return t; } Position findMax(SearchTree t) { while (t->right) t = t->right; return t; } static size(SearchTree t) { if (t) { return t->size; } return 0; } SearchTree insert(ElementType X, SearchTree t) { if (t == NULL) {//包含树没有初始化 t = malloc(sizeof(struct TreeNode)); if (t == NULL) Error("out of memory"); t->element = X; t->left = NULL; t->right = NULL; t->size = 1; } else { if (X < t->element) t->left = insert(X, t->left); else if (X>t->element) t->right = insert(X, t->right); t->size = size(t->left) + size(t->right) + 1; } return t;//两种情况 } SearchTree Delete(ElementType X, SearchTree t) { Position tempCell; if (t == NULL) { Error("Element not found"); } else if (X < t->element) t->left = Delete(X, t->left); else if (X > t->element) t->right = Delete(X, t->right); else if (t->left && t->right) { tempCell = findMin(t->right); t->element = tempCell->element; t->right = Delete(t->element, t->right); } else { tempCell = t; if (t->left == NULL) t = t->right; else if (t->right == NULL) t = t->left; free(tempCell); } if (t) { t->size = size(t->left) + size(t->right) + 1; } return t; } ElementType Retrieve(Position p) { return p->element; } Position findKth(SearchTree t, int i) { if (i <= size(t->left)) { return findKth(t->left, i); } else if (i == size(t->left) + 1) return t; else if (i <= t->size) return findKth(t->right, i -size(t->left) - 1); else return NULL; }
#include<stdlib.h> #include"tree.h" #include<stdio.h> struct TreeNode { ElementType element; SearchTree left; SearchTree right; int size; }; void Dir(SearchTree t) { if (t) { printf("%d ", t->element); Dir(t->left); Dir(t->right); } } int RandInt(int i, int j) { int temp; temp = (int)(i + (1.0*rand() / RAND_MAX)*(j - i)); return temp; } void getRandomInt(int *A,int n) { for (int i = 0; i < n; i++) { A[i] = i + 1; } for (int i = 1; i < n; i++) { //std::swap(A[i], A[RandInt(0, i)]); int randAdrr = RandInt(0, i); int t = A[i]; A[i] = A[randAdrr]; A[randAdrr] = t; } } #define N 1208 int main() { SearchTree t1 = NULL; int a[N]; getRandomInt(a, N); for (int i = 0; i < N; i++) t1 = insert(a[i], t1); printf("%d", findKth(t1, 135)->element); }