二叉排序树的创建和遍历与删除指定的节点

来源:互联网 发布: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;}


 

 


 

原创粉丝点击