赞
踩
本文参考自《大话数据结构》
如果查找的数据集是有序线性表,并且是顺序存储的,查找可以用折半、插值、斐波那契等查找算法来实现,可惜,因为有序,在插入和删除操作上,就需要耗费大量的时间。
二叉排序树(Binary Sort Tree),又称为二叉查找树。它或者是一棵空树,或者是具有下列性质的二叉树。
构造一棵二叉排序树的目的,其实并不是为了排序,而是为了提高查找和插入删除关键字的速度。不管怎么说,在一个有序数据集上的查找,速度总是要快于无序的数据集的,而二叉排序树这种非线性的结构,也有利于插入和删除的实现。
/* 二叉树的二叉链表结点结构定义 */
typedef struct BiTNode{
int data;
struct BiTNode *lchild, *rchild; //左右孩子指针
}BiTNode, *BiTree;
/* 递归查找二叉排序树T中是否存在key */ /* 指针f指向T的双亲,其初始调用值为NULL */ /* 若查找成功,则指针p指向数据元素结点,并返回TRUE */ /* 否则指针p指向查找路径上访问的最后一个结点并返回FALSE */ Status SearchBST(BiTree T, int key, BiTree f, BiTree *p){ if(!T){ //查找不成功 *p = f; return FALSE; }else if(key == T->data){ //查找成功 *p = T; return TRUE; }else if(key < T->data) return SearchBST(T->lchild, key, T, p); //在左子树继续查找 else return SearchBST(T->rchild, key, T, p); //在右子树继续查找 }
/* 当二叉排序树T中不存在关键字等于key的数据元素时 */ /* 插入key并返回TRUE,否则返回FALSE */ Status InsertBST(BiTree *T, int key){ BiTree p, s; if(!SearchBST(*T, key, NULL, &p)){ //查找不成功 s = (BiTree)malloc(sizeof(BiTNode)); s->data = key; s->lchild = s->rchild = NULL; if(!p) //如果p是空的,p指向的是双亲结点,也就是说双亲是空的,即空树 *T = s; //插入s为新的根结点 else if(key < p->data) //否则,如果关键字小于双亲的值 p->lchild = s; //插入s为左孩子 else //如果关键字大于双亲的值 p->rchild = s; //插入s为右孩子 return TRUE; }else return FALSE; //树中已有关键字相同的结点,不再插入 }
int i;
int a
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。