實現二叉搜索樹

#include<stdio.h>3d

#include<stdlib.h>code

typedef int elementType;遞歸

typedef struct Search_Tree {element

elementType data;

struct Search_Tree *left;

struct Search_Tree *right;

}Search, *Tree;get

//遞歸的插入法,很容易理解io

void insert(Tree *head, int x) {遍歷

if (*head == NULL) {

	(*head) = (Tree)malloc(sizeof(Search));
	
	printf("插入成功\n");
	
	(*head)->data = x;
	
	(*head)->left = (*head)->right = NULL;
	
}

else if (x < (*head)->data) {

	insert(&(*head)->left, x);
}

else {

	insert(&(*head)->right, x);
}

} //先序遍歷數據

void preOrder(Tree head) {di

if (head == NULL)

	return;
	
else {

	printf("%3d", head->data);
	
	preOrder(head->left);
	
	preOrder(head->right);
	
}

}while

//中序遍歷

void middleOrder(Tree head) {

if (head == NULL) {

	return;
}

else {

	middleOrder(head->left);
	
	printf("%3d", head->data);
	
	middleOrder(head->right);
}

}

//後序遍歷

void afterOrder(Tree head) {

if (head == NULL) {

	return;
}

else {

	afterOrder(head->left);
	
	afterOrder(head->right);
	
	printf("%3d", head->data);

}

}

//查找元素,遞歸查找,屬於尾遞歸,能夠改成非遞歸的方式

Tree find(Tree head, int x) {

if (!head || head->data == x)

	return head;
	
else if (head->data > x) {

	return find(head->left, x);
}

else {

	return find(head->right, x);
}

}

//找最小值

Tree min(Tree head) {

//請注意這個地方的處理,老是存儲空以前的一個節點,就是最小值節點  

Tree temp = head;

while (head != NULL) {

	temp = head;
	
	head = head->left;
}

return temp;

}

//找最大值

Tree max(Tree head) {

Tree temp = head;

while (head != NULL) {

	temp = head;
	
	head = head->right;

}

return temp;

}

//刪除元素

Tree delete_tree(Tree head, int x) {

Tree temp;

if (head == NULL)

	printf("要刪除的元素沒有找到");

else if (x < head->data)//若是要刪除的元素小於當前節點的數據,就到左子樹去刪 

	head->left = delete_tree(head->left, x);
	

else if (x > head->data) { //若是要刪除的元素大於當前節點的數據,就到右子樹去刪 

	int te = head->data;
	
	printf("%d\n", te);
	
	head->right = delete_tree(head->right, x);
}
else { //若是找到了的話, 

	int t1 = head->data;
	
	printf("%d\n", t1);
	
	if (head->left&&head->right) {//判斷左右子樹非空 
	
		temp = min(head->right); //咱們使用又子樹的最小值來填充該節點 
		
		head->data = temp->data;
		
		head->right = delete_tree(head->right, head->data);
	}
	
	else {
	
		temp = head;
		
		if (!head->left)
		
			head = head->right;
			
		else if (!head->right)
		
			head = head->left;
		free(temp);
	}
}

return head;

}

//非遞歸查找

Tree find1(Tree head, int x) {

while (head != NULL) {

	if (head->data == x)
	
		return head;
		
	else if (head->data > x)
	
		head = head->left;
	else
	
		head = head->right;

}
return head;

}

int main() {

int i;
int a[] = {5,3,2,4,8,7,9};

int length = sizeof(a) / sizeof(a[0]);

Tree p = NULL;

for (i = 0; i < length; i++) {

	insert(&p, a[i]);
}
//次地方返回的是頭結點,我沒有接收

delete_tree(p, 8);

preOrder(p);

printf("\n");

middleOrder(p);

printf("\n");

afterOrder(p);

printf("\n");

Tree temp = find(p, 3);

printf("%d\n", temp->data);

Tree temp1 = min(p);

printf("min=%d\n", temp1->data);

Tree temp2 = max(p);

printf("max=%d\n", temp2->data);

getchar();

return 0;

}

相關文章
相關標籤/搜索