二叉查找樹在查找中有着重要的應用,一個二叉樹變成一個二叉查找樹後所具有的性質是:對於樹中的所有結點,它的左子樹中的所有關鍵字的值小於該結點的關鍵字值,它的右子樹中所有關鍵字的值大於該結點關鍵字的值。這就是二叉查找樹。自己腦補一下什麼是二叉查找樹,什麼是普通二叉樹。由於樹的遞歸定義,通常是遞歸地編寫這些操作的例程。
下面是二叉查找樹的操作例程,注:由於這裏的所有操作函數都使用了遞歸,所以我把這些代碼的詳細總結放在了我的一篇專門用來總結遞歸的文章裏-------------遞歸算法設計總結
頭文件
#ifndef TREE_H_INCLUDED
#define TREE_H_INCLUDED
typedef struct tree_node{
int data;
struct tree_node *left;
struct tree_node *right;
}Search_Tree;
void Make_Empty(Search_Tree *T);
Search_Tree *Find(Search_Tree *T, int X);
Search_Tree *Find_Min(Search_Tree *T);
Search_Tree *Find_Max(Search_Tree *T);
Search_Tree *Insert_Node(Search_Tree *T, int X);
Search_Tree *Delete_Node(Search_Tree *T, int X);
#endif // TREE_H_INCLUDED
C文件
#include <stdio.h>
#include <stdlib.h>
#include "tree.h"
int main()
{
Search_Tree *tree = NULL;
Make_Empty(tree);
tree = Insert_Node(tree, 5);
// tree = Insert_Node(tree, 4);
// tree = Insert_Node(tree, 6);
// tree = Insert_Node(tree, 3);
// tree = Insert_Node(tree, 7);
Delete_Node(tree, 5);
// printf("%d\n", tree->left->left->data);
// printf("%d\n", tree->left->data);
// printf("%d\n", tree->data);
// printf("%d\n", tree->right->data);
//printf("%d\n", tree->right->right->data);
}
void Make_Empty(Search_Tree *T)
{
if(T != NULL){
Make_Empty(T->left);
Make_Empty(T->right);
free(T);
}
}
Search_Tree *Find(Search_Tree *T, int X)
{
if(T == NULL)
return NULL;
else{
if(X == T->data)
return T;
else if(X < T->data)
return Find(T->left, X);
else
return Find(T->right, X);
}
}
Search_Tree *Find_Min(Search_Tree *T)
{
if(T == NULL)
return NULL;
else if(T->left == NULL)
return T;
else
return Find_Min(T->left);
}
Search_Tree *Find_Max(Search_Tree *T)
{
if(T == NULL)
return NULL;
else
while(T->right != NULL)
T = T->right;
return T;
}
Search_Tree *Insert_Node(Search_Tree *T, int X)
{
if(T == NULL)
{
T = (Search_Tree *)malloc(sizeof(Search_Tree));
if(T == NULL)
exit(1);
T->data = X;
T->left = NULL;
T->right = NULL;
}
else if(T->data > X)
{
T->left = Insert_Node(T->left, X);
}
else if(T->data < X)
{
T->right = Insert_Node(T->right, X);
}
return T;
}
Search_Tree *Delete_Node(Search_Tree *T, int X)
{
Search_Tree *temp_cell;
if(T == NULL)
{
printf("End!!");
exit(1);
}
else if(X < T->data)
{
T->left = Delete_Node(T->left, X);
}
else if(X > T->data)
{
T->right = Delete_Node(T->right, X);
}
else if(T->left && T->right)
{
temp_cell = Find_Min(T->right);
T->data = temp_cell->data;
T->right = Delete_Node(T->right, T->data);
}
else
{
temp_cell = T;
if(T->left == NULL)
T = T->right;
else
T = T->left;
free(temp_cell);
}
return T;
}