二叉查找树满足以下性质:若x为根(树或者子树),若y是x的左子树上的节点,则value(y)<value(x),若y是x的右子树上的节点,则value(y)>value(x)。
使用二叉查找树进行查找时,平均的查找时间为O(lgn),最坏的查找时间为O(n)。
根据二叉树的定义可以得出以下结论:
(1)对二叉查找树进行中序遍历会得到一个有序的序列。
(2)若二叉查找树中的某个结点有两个子女,则其后继没有左子女,其前趋没有右子女。
二叉查找树结构体定义:
typedef struct binary_search_tree{
struct binary_search_tree* left;//左孩子
struct binary_search_tree* right;//右孩子
struct binary_search_tree* parent;//父节点
int value;//数据,可以引申为结构体,但需要提供不同的算法
}binary_search_tree;
为了加强对C语法的掌握度,笔者在刚开始时,使用函数指针结构体,后面为了减少复杂程度,去除了对函数指针的使用。函数指针结构体:
typedef struct operation_binary_search{
binary_search_tree* (*binary_search_tree_create)(binary_search_tree* T,int* value_array,int array_length,struct operation_binary_search*operation);//创建
binary_search_tree* (*binary_search_tree_insert)(binary_search_tree* T,int key);//插入
void (*print_binary_tree_value)(binary_search_tree*T);//遍历
}operation_binary_search;
在程序中,将一些基本操作定义为了宏,但这是在书写代码过程中才使用的,有部分代码未使用这些宏。
宏的定义:
#define LEFT(T) T -> left //左子树
#define RIGHT(T) T -> right //右子树
#define PARENT(T) T -> parent //父节点
1.插入新的节点
此处使用两种方法进行实现,递归和迭代。思路是:若比根节点大,则向右走;比根节点小,向左走;直到走到叶子(即NULL)。
递归方式:
binary_search_tree* binary_search_tree_insert_Recuision(binary_search_tree* T,int key){
if(T == NULL){//找到位置