1.顺序查找
#include <stdio.h>
#include <stdlib.h>
# include <malloc.h>
#define Maxsize 50
typedef struct{
int *data;
int length,max;
}sqlist2;
void init_list2(sqlist2* lt){
if (lt !=NULL){
lt->data =(int *)malloc(sizeof(int)*Maxsize);
lt->length=0;
lt->max =Maxsize;
}
}
void create_list2(sqlist2 * lt, int num){
printf("请输入元素:");
int i;
for( i =1; i<num;i++){
scanf("%d",<->data[i]);
}
lt->length+=num;
}
void extendplace(sqlist2 * lt){
int n;
printf("请输入要扩容的数目:");
scanf("%d",&n);
int *p;
p=lt->data;
lt->data =(int*)malloc((lt->max + n)*sizeof(int));
int i;
for(i=0;i<lt->length;i++){
lt->data[i]=p[i];
}
lt->max +=n;
free(p);
}
void print_list2(sqlist2 lt){
int i;
if (lt.length!=0){
printf("当前表中元素有:");
for( i=0;i<lt.length;i++)
{
printf("%d\t",lt.data[i]);
}
printf(" 表长%d:\n",lt.length);
}
else{
printf("当前为空表!");
}
printf("\n");
}
int search(sqlist2 st,int key){
st.data[0] =key;
int i;
for( i=st.length;key!=st.data[i];i--);
printf("%d",i);
return i;
}
int main(){
int num;
printf("输入创建表长:");
scanf("%d",&num);
int n;
sqlist2 lt;
init_list2(<);
create_list2(<,num);
search(lt,6);
print_list2(lt);
}
2.折半查找
#include <stdio.h>
#include <stdlib.h>
# include <malloc.h>
#define Maxsize 50
typedef struct{
int *data;
int length,max;
}sqlist2;
void init_list2(sqlist2* lt){
if (lt !=NULL){
lt->data =(int *)malloc(sizeof(int)*Maxsize);
lt->length=0;
lt->max =Maxsize;
}
}
void create_list2(sqlist2 * lt, int num){
printf("请输入元素:");
int i;
for( i =0; i<num;i++){
scanf("%d",<->data[i]);
}
lt->length+=num;
}
void extendplace(sqlist2 * lt){
int n;
printf("请输入要扩容的数目:");
scanf("%d",&n);
int *p;
p=lt->data;
lt->data =(int*)malloc((lt->max + n)*sizeof(int));
int i;
for(i=0;i<lt->length;i++){
lt->data[i]=p[i];
}
lt->max +=n;
free(p);
}
void print_list2(sqlist2 lt){
int i;
if (lt.length!=0){
printf("当前表中元素有:");
for( i=0;i<lt.length;i++)
{
printf("%d\t",lt.data[i]);
}
printf(" 表长%d:\n",lt.length);
}
else{
printf("当前为空表!");
}
printf("\n");
}
int search(sqlist2 lt,int key){
int low=0,high=lt.length-1,mid;
while(low <= high){
mid =(low+high)/2;
if(lt.data[mid] == key)
return mid;
else if(lt.data[mid] > key)
high= mid-1;
else
low=mid+1;
}
return -1;
}
int main(){
int num;
printf("输入创建表长:");
scanf("%d",&num);
int n;
sqlist2 lt;
init_list2(<);
create_list2(<,num);
printf("%d",search(lt,3));
print_list2(lt);
}
习题
3.6判定是否 二叉排序树
bool isBSTUtil(Tree node, int* prev) {
if (node == NULL)
return true;
if (!isBSTUtil(node->left, prev) || node->data <= *prev)
return false;
*prev = node->data;
return isBSTUtil(node->right, prev);
}
3.8判定平衡二叉树
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
typedef struct TreeNode {
int data;
struct TreeNode* left, *right;
} TreeNode, *Tree;
int height(Tree root) {
if (root == NULL) {
return 0;
}
int left_height = height(root->left);
int right_height = height(root->right);
return (left_height > right_height) ? (left_height + 1) : (right_height + 1);
}
bool isBalanced(Tree root) {
if (root == NULL) {
return true;
}
int left_height = height(root->left);
int right_height = height(root->right);
if (abs(left_height - right_height) <= 1 &&
isBalanced(root->left) &&
isBalanced(root->right)) {
return true;
}
return false;
}
int main() {
Tree root = (Tree)malloc(sizeof(TreeNode));
root->data = 1;
root->left = (Tree)malloc(sizeof(TreeNode));
root->left->data = 2;
root->left->left = root->left->right = NULL;
root->right = (Tree)malloc(sizeof(TreeNode));
root->right->data = 3;
root->right->left = root->right->right = NULL;
if (isBalanced(root)) {
printf("是平衡二叉树 (Balanced Binary Tree)。\n");
} else {
printf("不是平衡二叉树 (Balanced Binary Tree)。\n");
}
return 0;
}
3.10 二叉排序树 从大到小输出不小于k关键字
#include <stdio.h>
#include <stdlib.h>
typedef struct TreeNode {
int data;
struct TreeNode* left, *right;
} TreeNode, *Tree;
void reverseInOrder(Tree root, int k) {
if (root == NULL)
return;
reverseInOrder(root->right, k);
if (root->data >= k)
printf("%d ", root->data);
reverseInOrder(root->left, k);
}
Tree insert(Tree root, int data) {
if (root == NULL) {
Tree newNode = (Tree)malloc(sizeof(TreeNode));
newNode->data = data;
newNode->left = newNode->right = NULL;
return newNode;
}
if (data < root->data) {
root->left = insert(root->left, data);
} else if (data > root->data) {
root->right = insert(root->right, data);
}
return root;
}
void printTree(Tree root) {
if (root == NULL) {
return;
}
printTree(root->left);
printf("%d ", root->data);
printTree(root->right);
}
int main() {
Tree root = NULL;
int k = 3;
int values[] = {5, 2, 8, 1, 3, 7, 9};
for (int i = 0; i < sizeof(values) / sizeof(values[0]); i++) {
root = insert(root, values[i]);
}
reverseInOrder(root, k);
printf("\n");
return 0;
}