VC++2012编程演练数据结构《12》二叉排序树
2012-11-19 20:20
579 查看
二叉排序树(Binary Sort Tree)又称二叉查找树。
它或者是一棵空树;或者是具有下列性质的二叉树:
(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;
(2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;
(3)左、右子树也分别为二叉排序树;
每个结点的C(i)为该结点的层次数。最坏情况下,当先后插入的关键字有序时,构成的二叉排序树蜕变为单支树,树的深度为,其平均查找长度为(n+1)/2(和顺序查找相同),最好的情况是二叉排序树的形态和折半查找的判定树相同,其平均查找长度和log 2 (n)成正比。
类实现如下
调用如下
效果如下
代码下载
http://download.csdn.net/detail/yincheng01/4786038
它或者是一棵空树;或者是具有下列性质的二叉树:
(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;
(2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;
(3)左、右子树也分别为二叉排序树;
每个结点的C(i)为该结点的层次数。最坏情况下,当先后插入的关键字有序时,构成的二叉排序树蜕变为单支树,树的深度为,其平均查找长度为(n+1)/2(和顺序查找相同),最好的情况是二叉排序树的形态和折半查找的判定树相同,其平均查找长度和log 2 (n)成正比。
类实现如下
#include "stdafx.h" #include <iostream> #include <iomanip> #include<stdlib.h> using namespace std; //二叉树的链式存储结构表示 typedef struct BinaryTree { int data; struct BinaryTree *l; struct BinaryTree *r; }*BiTree,BiNode; //二叉树的类定义 class BiSearchT {private: BiTree root; public: //构造函数 BiSearchT():root(NULL) {} //构造二叉链表表示的二叉树T int CreateSubTree(BiTree &t,int *all,int i); //先序遍历二叉树T int PreOrderTraverse(BiTree t,int (*Visit)(int e)); //中序遍历二叉树T int InOrderTraverse(BiTree t,int (*Visit)(int e)); //插入算法 int InsertBST(BiTree *t,int e); //在二叉排序树中删除一个节点 void Delete(BiTree *p); //二叉排序树的删除 bool DeleteBST(BiTree *t,int key); //二叉排序树上的查找递归算法 bool SearchBST(BiTree t,int key,BiTree f,BiTree *p); }; //二叉排序树的类实现 //构造二叉链表表示的二叉树T int BiSearchT::CreateSubTree(BiTree &t,int *all,int i) {if((all[i]==0)||i>16) {t=NULL; return 1;} t=(BiNode *)malloc(sizeof(BiNode)); if(t==NULL) return 0; t->data=all[i]; CreateSubTree(t->l,all,2*i); CreateSubTree(t->r,all,2*i+1); } //先序遍历二叉树T int BiSearchT::PreOrderTraverse(BiTree t,int (*Visit)(int d)) { if(t){ if(Visit(t->data)) if(PreOrderTraverse(t->l,Visit)) if(PreOrderTraverse(t->r,Visit)) return 1; return 0; } else return 1; } //中序遍历二叉树T int BiSearchT::InOrderTraverse(BiTree t,int (*Visit)(int d)) { if(t){ if(InOrderTraverse(t->l,Visit)) if(Visit(t->data)) if(InOrderTraverse(t->r,Visit)) return 1; return 0; }else return 1; } //二叉排序树上的查找递归算法 bool BiSearchT::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) SearchBST(t->l,key,t,p); else SearchBST(t->r,key,t,p);//继续在右子树中查找 } //插入算法 int BiSearchT::InsertBST(BiTree *t,int e){ BiTree p; BiTree s; if(!SearchBST(*t,e,NULL,&p)){ s=(BiTree)malloc(sizeof(BiNode)); s->data=e;s->l=s->r=NULL; if(!p) *t=s; else if(e<p->data) p->l=s; else p->r=s; return true; } else return false; } //在二叉排序树中删除一个节点 void BiSearchT::Delete(BiTree *p){ BiTree q,s; if(!(*p)->r)//在右子树删除 {q=(*p); (*p)=(*p)->l; free(q);} else if(!(*p)->l)//在左子树删除 {q=(*p); (*p)=(*p)->r; free(q);} else {q=s=(*p)->l; while(s->r) s=s->r; s->r=(*p)->r; free(*p); (*p)=q;} } //二叉排序树的删除 bool BiSearchT::DeleteBST(BiTree *t,int key) {if(*t!=NULL) {if (key==(*t)->data) Delete(t); else if(key<(*t)->data) DeleteBST(&((*t)->l),key); else DeleteBST(&((*t)->r),key); return true;} else return false; } //输出二叉排序树的数据域值 int printelem(int d) {cout<<setw(4)<<d; return 1; }
调用如下
//二叉排序树类的测试 void main() {cout<<"运行结果:\n"; BiTree root; BiTree sroot=NULL; BiTree croot=NULL; int all[16]={0,1,2,3,0,0,4,5,0,0,0,0,6,0,0,0}; int i,a[10]={45,23,12,3,33,27,56,90,120,62}; int n=7,b[]={10,7,6,9,20,12,22}; BiSearchT my; my.CreateSubTree(root,all,1); cout<<"先序遍历(root,all):\n"; my.PreOrderTraverse(root,printelem); cout<<"\n中序遍历(root,all):\n"; my.InOrderTraverse(root,printelem); for(i=0;i<10;i++) my.InsertBST(&sroot,a[i]); cout<<"\n中序遍历(sroot,a):\n"; my.InOrderTraverse(sroot,printelem); for(i=0;i<3;i++) my.DeleteBST(&sroot,a[i]); cout<<"\nNow sroot has nodes:\n"; my.InOrderTraverse(sroot,printelem); for(i=0;i<n;i++) my.InsertBST(&croot,b[i]); cout<<"\n中序遍历(croot,b):\n"; my.InOrderTraverse(croot,printelem); my.InsertBST(&croot,8); cout<<"\n中序遍历(croot,b):\n"; my.InOrderTraverse(croot,printelem); my.DeleteBST(&croot,7); cout<<"\n中序遍历(croot,b):\n"; my.InOrderTraverse(croot,printelem); cin.get();
}
效果如下
代码下载
http://download.csdn.net/detail/yincheng01/4786038
相关文章推荐
- 【Data_Structure笔记12】查找算法之【基于二叉排序树的查找】
- 16 - 12 - 11 二叉排序树
- 北邮OJ-97. 二叉排序树-12计院上机C
- 16 - 12 - 31 二叉排序树
- 数据结构和算法系列12 五大查找之二叉排序树
- 数据结构和算法系列12 五大查找之二叉排序树
- VC++2012编程演练数据结构《12》二叉排序树
- 数据结构学习笔记(12)----平衡二叉排序树
- 12.采用左右值编码来存储无限分级树形结构的数据库表设计[摘自网络]
- 游戏开发中的数学和物理算法(12):矢量的加减法
- JAVA基础--db12_java包机制
- 【java基础 12】HashMap中是如何形成环形链表的?
- 二叉排序树——华中科技大学复试上机
- Fedora 12中NVIDIA显卡的安装
- (12)希尔排序
- UI12_UItabBarViewController
- 17 - 02 - 12 计算机网络(33)(BT、迅雷 概述)
- 算法分析与设计week12--416. Partition Equal Subset Sum
- Sybase PowerDesigner 12通用的破解方法
- 第13周项目12-汉诺塔扩展