//二叉排序树的查找
BiTree search(BiTree T,int key){
if(T == NULL) //递归出口
return NULL;
if(T->data == key) //递归出口
return T->data;
else if(key < T->data)
search(T->lchild,key);
else
search(T->rchild,key);
}
//二叉排序树插入的递归算法
//算法思想:
//1.T->data = k; 插入失败
//2.k > T->data,在T的右子树找; k < T->data,在T的左子树找;
// 当在一个结点上找到T == NULL时;把k插入进去,return 1;插入成功
int BST_Insert(BiTree &T,Keytype k){
if(T == NULL){ //为空,插入
T = (BiTree)malloc(sizeof(BiTreeNode));
T->data = k;
T->lchild = NULL;
T->rchild = NULL;
return 1; //插入成功
}
else if(k < T->data)
BST_Insert(T->lchild,k);
else if(k > T->data)
BST_Insert(T->rchild,k);
else
return 0;
}
//二叉排序树非递归算法
//算法思想:
//1.若T刚开始为空,则直接创建结点插入
//2.若T不为空。比较T->data 与 key的大小
// if key < T->data,往左找
// if key > T->data,往右找
// 直到找到一个结点的data为NULL,把key插入到这个结点
//但是在插入这个结点之前,要拿到这个结点的父亲结点,所以要设置一个preT
//然后用tag 的值来判断到底是在preT的左孩子还是右孩子
int BST_Insert(BiTree &T,int key){
if(T == NULL){ //如果根节点为空,直接插入
T = (BiTree)malloc(sizeof(BiTreeNode));
T->data = key;
T->lchild = T->rchild = NULL;
return 1;
}
BiTree preT;
int tag; //用于当T为NULL时,根据tag的值判断是左边来的还是右边来的
while(T != NULL){ //如果根节点不为空
if(key < T->data){ //关键字小于根节点值,在左边找,tag改成0
preT = T;
tag = 0;
T = T->lchild;
}else if(key > T->data){ //关键字小于根节点值,在右边找,tag改成1
preT = T;
tag = 1;
T = T->rchild;
}
else //关键字与根节点值相等,插入失败
return 0;
}
BiTree k = (BiTree)malloc(sizeof(BiTreeNode));
k->data = key;
k->lchild = k->rchild = NULL;
if(tag == 0)
preT->lchild = k; //将k接到preT的左边
else
preT->rchild = k; //将k接到preT的右边
return 1; //插入成功
}
//二叉排序树的构造:
void Creat_BST(BiTree &T,int str[],int n){
T = NULL;
int i = 0;
while(i<n){
BST_Insert(T,str[i]);
i++;
}
}
二叉排序树的查找,插入
最新推荐文章于 2024-05-13 11:13:07 发布