一.定义和查找指定值:
二叉排序树又称二叉查找树。Binary Search Tree
左子树<根节点<右子树
- 非递归算法:
常数级空间即可O(1)
//定义二叉排序树
typedef struct BSTNode{
int val;
struct BSTNode *lChild,*rchild;
}BSTNode,*BSTree;
BSTNode* BST_Search(BSTree T,int key){
while(T!=NULL&&T->val!=key){
if(key<T->val) //若关键值小于当前结点的值
T=T->lchild;//往左子树走
else T=T->rchild;//大于当前结点值则往右边走
}
return T;
}
- 递归算法:
最坏空间复杂度O(h)和树的高度有关
//递归实现
BSTNode* BST_Search(BSTree T,int key){
if(T==NULL||T->val==key)
return T; //递归出口
else if(key<T->val) //若key值小于当前结点值
return BST_Search(T->lchild,key); //递归往左子树走
else
return BST_Search(T->rchild,key); //递归往右子树走
}
二.二叉排序树的插入:
插入的结点一定是叶子结点。
若二叉排序树为空,则直接插入结点。不允许插入重复结点。
int BST_Insert(BSTree &T,int k){ //注意是引用类型
if(T==NULL){ //原树为空,新插入结点需要分配空间
T=(BSTree)malloc(sizeof(BSTNode));
T->val=k;
T->lchild=NULL;
T->rchild=NULL;
return 1;
}
else if(T->val==k)
return 0; //插入失败,因为不允许插入重复元素
else if(k<T->val)
return BSTree_Insert(T->lchild,k);
else
return BSTree_Insert(T->rchild,k);
}
三.二叉排序树的构造:
void BSTree_Creat(BSTNode &T,int str[],int n){
T=NULL; //初始二叉树为空
int i=0;
while(i<n){
BSTree_Insert(T,int str[i]);
i++;
}
}