#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;
}