动态查找还有对平衡二叉树,B树,B+树的掌握,这里只有二叉排序树
一、二叉排序树的代码实现
#include <stdio.h>
#include <stdlib.h>
typedef int KeyType;
typedef struct BSTNode{
KeyType data;
struct BSTNode *lchild;
struct BSTNode *rchild;
}BSTNode;
int Insert(BSTNode *p,int key){
if(p == NULL){
p = (BSTNode *)malloc(sizeof(BSTNode));
p->data = key;
p->lchild = NULL;
p->rchild = NULL;
}else{
if(key > p->data) return Insert(p->rchild,key);
if(key < p->data) return Insert(p->lchild,key);
if(key == p->data) return 0;
}
return -1;
}
BSTNode * CreateTree(int Array[],int size){
int i = 0;
BSTNode *bt = NULL;
for(i=0;i<size;i++){
Insert(bt,Array[i]);
}
return bt;
}
BSTNode findNum(BSTNode T,int value){
if(T==NULL || value = T->data) return T;
if(k < T->data) return findNum(T->lchild,value);
if(k > T->data) return findNum(T->rchild,value);
return 0;
}
BSTNode SearNum(BSTNode T,int k){
BSTNode p = T;
while(p!=NULL && p->data != k){
if(p->data > key){
p = p->lchild;
}else{
p = p->rchild;
}
}
return p;
}
int main(){
int ArrayData = {10,22,38,56,12,33,43,73};
BSTNode * B = CreateTree(ArrayData,7);
findNum(*B,10);
return 0;
}
二、二叉排序树的结点删除
上面算法没有提及到二叉排序树的删除 二叉排序树的删除分为三种情况
- 在叶子结点中,可以直接删除
- 只有左子树,或者右子树
- 左右子树都有,则要考虑一下图片中的两种情况
三、二叉排序树的平均查找长度(和折半查找判定树计算类似)
计算成功ASL平均查找长度
计算失败ASL平均查找长度
|