二叉排序树的创建和遍历与删除指定的节点
来源:互联网 发布:2017支付宝秒余额源码 编辑:程序博客网 时间:2024/05/29 16:57
二叉排序树(Binary Sort Tree)又称二叉查找树。 它或者是一棵空树;或者是具有下列性质的二叉树: (1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值; (2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值; (3)左、右子树也分别为二叉排序树;
二叉排序树性能分析
每个结点的C(i)为该结点的层次数。最坏情况下,当先后插入的关键字有序时,构成的二叉排序树蜕变为单支树,树的深度为,其平均查找长度为(n+1)/2(和顺序查找相同),最好的情况是二叉排序树的形态和折半查找的判定树相同,其平均查找长度和log 2 (n)成正比
二叉排序树的优化 Size Balanced Tree(SBT)
AVL树
红黑树
Treap(Tree+Heap)
这些均可以使查找树的高度为O(log(n))
http://blog.csdn.net/hackbuteer1/article/details/7275396
//输入一系列整数,建立二叉排序树,遍历typedef struct BiTNode{int value;struct BiTNode *lChild,*rChild;}*BiTree;bool LT(int a,int b){return a<b?true:false;}bool SearchBST(BiTree root,int data,BiTree f,BiTree& p){if(!root){p=f;return false;}else if(data==root->value){p=root;return true;}else if(data<root->value){return SearchBST(root->lChild,data,root,p);}else if(data>root->value)return SearchBST(root->rChild,data,root,p);}void InsertBST(BiTree& root,int data){BiTree p,s;if(!SearchBST(root,data,NULL,p)){s=(struct BiTNode*)malloc(sizeof(BiTNode));s->value=data;s->lChild=s->rChild=NULL;if(p==NULL)root=s;else if(LT(data,p->value)){p->lChild=s;}else p->rChild=s;}return;}void PreOrderTraverse(BiTree root){if(root){cout<<root->value<<" ";PreOrderTraverse(root->lChild);PreOrderTraverse(root->rChild);}}void InOrderTraverse(BiTree root){if(root){InOrderTraverse(root->lChild);cout<<root->value<<" ";InOrderTraverse(root->rChild);}}void PostOrderTraverse(BiTree root){if(root){PostOrderTraverse(root->lChild);PostOrderTraverse(root->rChild);cout<<root->value<<" ";}}void DeleteBST(BiTree root){if(root){DeleteBST(root->lChild);DeleteBST(root->rChild);free(root);}}int main(){int i,a[101],n;BiTree root;while(scanf("%d",&n)!=EOF){root=NULL;for(i=1;i<=n;i++){scanf("%d",&a[i]);InsertBST(root,a[i]);}PreOrderTraverse(root);printf("\n");InOrderTraverse(root);printf("\n");PostOrderTraverse(root);printf("\n");DeleteBST(root);}return 0;}
删除二叉排序树指定的节点:
转自 http://baike.baidu.com/view/647462.htm 百度百科
void Delete(BiTree &p){//从二叉树排序树中删除节点p,并且重新连接他的左或右子树BiTree q;BiTree s;if(!p->rChild)//节点的右子树为空 只需要连接他的左子树{q=p;p=p->lChild;delete q;}else if(!p->lChild)//左子树为空 只需要连接他的右子树即可{q=p;p=p->rChild;delete q;}else//左右子树都不空{q=p;s=p->lChild;while(s->rChild)//找到左边的子树的最右边节点{q=s;//q指向最右边节点的父节点s=s->rChild;}p->value=s->value;//用删除节点的前驱来代替他if(q!=p){q->rChild=s->lChild;//连接s的左子树}elseq->lChild=s->lChild;//连接s的左子树delete s;}return;}void DeleteBSTKey(BiTree &T,int key){///若二叉排序树中存在Key,则删除之if(!T)return;else{if(key==T->value){return Delete(T);}}if(key<T->value)return DeleteBSTKey(T->lChild,key);elsereturn DeleteBSTKey(T->rChild,key);}
int main(){int i,a[101],n;BiTree root;while(scanf("%d",&n)!=EOF){root=NULL;for(i=1;i<=n;i++){scanf("%d",&a[i]);InsertBST(root,a[i]);}DeleteBSTKey(root,5);PreOrderTraverse(root);printf("\n");InOrderTraverse(root);printf("\n");PostOrderTraverse(root);printf("\n");DeleteBST(root);}return 0;}
- 二叉排序树的创建和遍历与删除指定的节点
- 二叉排序树,完成创建节点,插入节点,删除节点,查找节点,中序遍历的功能
- 二叉排序树的创建与遍历
- 二叉排序树的创建与删除
- 二叉排序树的插入、遍历和删除
- 二叉排序树的创建查找与删除
- 二叉排序树的创建,查找与删除
- 二叉排序树的创建,插入和 删除操作
- 二叉排序树的创建,插入,遍历
- 二叉树与二叉排序树的创建于遍历
- 关于java写二叉排序树的问题,实现各种节点的插入,删除,遍历
- 二叉排序树删除节点的几种方法
- java实现二叉排序树的删除节点
- 二叉排序树的创建、插入和遍历(代码)
- 二叉排序树的建立与遍历
- 二叉排序树的建立和遍历
- 二叉排序树的建立和遍历
- 二叉排序树的建立和遍历
- 基于winsock的阻塞和非阻塞通信模型(1)
- 一个人的夜晚,才会最真实吧?:QQ伤感日志
- 电脑人如何保护皮肤和视力
- “关系型数据库”和“基于海量数据的分布式非关系数据库”
- POSIX thread (pthread) libraries
- 二叉排序树的创建和遍历与删除指定的节点
- 个人所得税计数器
- tomcat 在服务器(window/linux)上定时任务执行多次的BUG分析
- 鲍尔默:一意孤行驾着微软冲向悬崖
- 没有人会疼自己没人会懂,会理解:伤感空间日志
- setup-git-server-over-http
- 分布式文档存储数据库 MongoDB
- Android4.2系统全面解析
- 企业应用架构模式之Web表现模式