C语言实现二叉排序树的相关操作
2017-08-14 19:28
351 查看
二叉排序树(Binary Sort Tree),又称为二叉查找树。它或者是一颗空树,或者是具有下列性质的二叉树:
若它的左子树不为空,则左子树上的所有结点的值均小于它的根结点的值
若它的右子树不为空,则右子树上的所有结点的值均大于它的根结点的值
它的左右子树也分别为二叉排序树
构造二叉排序树的目的,并不是为了排序,而是为了提高查找和插入删除关键字的速度。
以下程序在DEV C++中调试运行通过。
二叉排序树的查找性能取决于二叉排序树的形状,二它的形状是不确定的。极端右斜树的查找时间复杂度为O(n),等同于顺序查找;而平衡二叉树的查找时间复杂度为O(logn),等同于折半查找。
若它的左子树不为空,则左子树上的所有结点的值均小于它的根结点的值
若它的右子树不为空,则右子树上的所有结点的值均大于它的根结点的值
它的左右子树也分别为二叉排序树
构造二叉排序树的目的,并不是为了排序,而是为了提高查找和插入删除关键字的速度。
以下程序在DEV C++中调试运行通过。
#include<stdio.h> #include<stdlib.h> /*二叉树的二叉链表结点结构定义*/ typedef struct BiTNode { int data; struct BiTNode *lchild,*rchild; }BiTNode,*BiTree; /*递归查找二叉排序树T中是否存在key,指针f指向T的双亲,其初始调用值为NULL,若查找成功,则指针P指向该数据元素结点,并返回1,否则指针p指向查找路径上访问的最后一个节点并返回0*/ int SearchBST(BiTree T,int key,BiTree f,BiTree *p) { if(!T)//查找不成功 { *p=f; return 0; } else if(key==T->data)//查找成功 { *p=T; return 1; } else if(key<T->data) return SearchBST(T->lchild,key,T,p);//在左子树继续查找 else return SearchBST(T->rchild,key,T,p);//在右子树继续查找 } /*当二叉排序树T中不存在关键字等于key的数据元素时,插入key并返回1,否则返回0*/ int 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) *T=s;//插入s为新的根结点 else if(key<p->data) p->lchild=s;//插入s为左孩子 else p->rchild=s;//插入s为右孩子 return 1; } else return 0; } /*若二叉排序树T中存在关键字key的数据元素时,则删除该数据元素节点,并返回1;否则返回0*/ int DeleteBST(BiTree *T,int key) { if(!T) return 0; else { if(key==(*T)->data) return Delete(T); else if(key<(*T)->data) return DeleteBST(&(*T)->lchild,key); else return DeleteBST(&(*T)->rchild,key); } } int Delete(BiTree *p) { BiTree q,s; if((*p)->rchild==NULL)//右子树为空只需重接它的左子树 { q=*p;*p=(*p)->lchild;free(q); } else if((*p)->lchild==NULL) { q=*p;*p=(*p)->rchild;free(q); } else//左右子树均不空 { q=*p;s=(*p)->lchild; while(s->rchild) { q=s;s=s->rchild; } (*p)->data=s->data; if(q!=*p) q->rchild=s->lchild; else q->lchild=s->lchild; free(s); } return 1; } int main() { int i,j; int a[10]={62,88,58,47,35,73,51,99,37,93}; BiTree T=NULL,p; //二叉排序树的插入和创建 for(i=0;i<10;i++) { InsertBST(&T,a[i]); } j=SearchBST(T,51,NULL,&p); if(j=1) printf("搜索51成功!"); j=DeleteBST(&T,47); if(j=1) printf("删除47成功!"); }运行结果如图所示。
二叉排序树的查找性能取决于二叉排序树的形状,二它的形状是不确定的。极端右斜树的查找时间复杂度为O(n),等同于顺序查找;而平衡二叉树的查找时间复杂度为O(logn),等同于折半查找。
相关文章推荐
- C语言:静态顺序表的实现和相关操作
- C语言实现单链表相关操作
- 数据结构单链表的相关操作(linux下实现)C语言
- c语言实现链表的相关的操作
- !-- 基于静态数组的顺序表相关操作C语言实现 --!
- 单链表相关操作之C语言实现:插入,删除,倒转,复制,查找。。。
- 【数据结构】链表及相关操作(C语言实现)
- 我面试遇到的C语言中单链表相关的操作粗浅实现
- 二叉树的建立与输出以及其他一些相关操作(递归算法实现) C语言
- 二叉排序树的建立以及相关操作 C语言
- C语言实现链表的相关操作
- C语言实现链表插入,删除相关操作
- C语言实现二叉排序树的增删查操作
- 单链表顺序存储相关操作的c语言实现
- 单链表相关操作--C语言实现
- 单链表基本操作C语言实现
- 温习二叉排序树的相关操作
- SpringCloud定时任务需要用redis实现分布式全局锁的相关操作
- 动态单链表的传统存储方式和10种常见操作-C语言实现
- 顺序队列(循环队列)基本操作实现 C语言