1、数据结构笔记 含代码1.二分查找的算法: int BinSearch(LineList R,int n,KeyType k) int i,low=0,high=n-1,mid; int find=0; while (low=high & !find) mid=(low+high)/2; if (kRmid.key) low=mid+1; else i=mid; find=1; if (find=0) return(-1); else return(i); 2.分块查找的算法: int BlkSearch(LineList R,IDXType idx,int m,KeyType k) int l
2、ow=0,high=m-1,mid,i,j,find=0; while (low=high & !find) mid=(low+high)/2; if (kidxmid.key) low=mid+1; else high=mid-1; find=1; if (lowm) i=idxlow.low; j=idxlow.high; while (i=j) return (-1); else return (i); 3.二叉排序树的类型定义 typedef struct tnode KeyType key; ElemType data; struct tnode *lchild,*rchild; B
3、STNode;4.二叉排序树的基本运算如下 1.查找结点 BSTNode *BSTSearch(BSTNode *bt,KeyType k) BSTNode *p=bt; while (p!=NULL & p-key!=k) if(kkey) p=p-lchild; else p=p-rchild; return (p); 2.插入结点BSTInsert(bt,k) int BSTInsert(BSTNode *&bt,KeyNode k) BSTNode *f,*p=bt; while(p!=NULL) if(p-key=k) return(0); f=p; if(p-keyk) p=p-l
4、child; else p=p-rchild; p=(BSTNode *)malloc(sizeof(BSTNode); p-key=k; p-lchild=p-rchild=NULL; if (bt=NULL) bt=p; else if(kkey) f-lchild=p; return(1); 3.创建二叉排序树CreateBST(bt,str,n) void CreateBST(BSTNode *&bt,KeyType str,int n) bt=NULL; int i=0; while(in) BSTInsert(bt,stri); i+; 4.输出二叉排序树 void DispBST
5、(BSTNode *bt) if (bt!=NULL) coutkey; if (bt-lchild!=NULL | bt-rchild!=NULL) coutlchild); if(bt-rchild!=NULL) coutrchild); cout); 1.插入排序: void InsertSort(SqList R,int n) int i,j; SqList tmp; for (i=1;i=0 & tmp.key0) for(i=gap;i=0 & tmp.keyRj.key) Rj+gap=Rj; j=j-gap; Rj+gap=tmp; j=j-gap; gap=gap/2; 3.
6、选择排序 void SelectSort(SqList R,int n) int i,j,k; SqList tmp; for(i=0;in-1;i+) k=i; for(j=i+1;jn;j+) if(Rj.key=1;i-) Sift(R,i,n); for(i=n;i=2;i-) tmp=Ri; R1=Ri; Ri=tmp; Sift(R,1,i-1); void Sift(SqList R,int low,int high) int i=low,j=2*i; SqList tmp=Ri; while (j=high) if(jhigh & Rj.keyRj+1.key) j+; if
7、(tmp.keyRj.key) Ri=Rj; i=j; j=2*i; else break; Ri=tmp; 5.冒泡排序 void BubbleSort(SqList R,int n) int i,j,exchange; SqList tmp; for(i=0;ii;j-) if(Rj.keyRj-1.key) tmp=Rj; Rj=Rj-1; Rj-1=tmp; exchange=1; if(exchange=0) return; 6.快速排序 void QuickSort(SqList R,int s,int t) int i=s,j=t; SqList tmp; if (si & Rj
8、.keytmp.key) j-; if (ij) Ri=Rj; i+; while(ij & Ri.keytmp.key) i+; if(ij) Rj=Ri; j-; Ri=tmp; QuickSort(R,s,i-1); QuickSort(R,i+1,t); 7.二路归并排序 void MergeSort(SqList R,int n) int length; for(length=1;lengthn;length=2*length) MergePass(R,length,n); void MergePass(SqList R,int length,int n) int i; for(i=
9、0;i+2*length-1n;i=i+2*length) Merge(R,i,i+length-1,i+2*length-1); if(i+length-1n) Merge(R,i,i+length-1,n-1); void Merge(SqList R,int low,int mid,int high) SqList *R1; int i=low,j=mid+1,k=0; R1=(SqList *)malloc(high-low+1)*sizeof(SqList); while (i=mid & j=high) if(Ri.key=Rj.key) R1k=Ri; i+;k+; else R
10、1k=Rj; j+;k+; while(i=mid) R1k=Ri; i+;k+; while(j=high) R1k=Rj; j+;k+; for(k=0,i=low;i=0;i-) for(j=0;jr;j+) headj=tailj=NULL; while (p!=NULL) k=p-datai-0; if(headk=NULL) headk=p; tailk=p; else tailk-next=p; tailk=p; p=p-next; p=NULL; for(j=0;jnext=headj; t=tailj; t-next=NULL; 1.树的定义: 树包含n个结点,当n=0时,称
11、为空树。树的定义如下: T=(D,R) 其中,D为树中结点的有限集合,关系R满足一下条件: 1.有且仅有一个结点k0属于D,它对于关系R来说没有前趋结点,结点k0称作树的根结点。 2.除根结点k0外,D中的每个结点有且仅有一个前趋结点,但可以由多个后继结点。 3.D中可以有多个终端结点。2.树的基本术语 1.结点的度:树中每个结点具有的子树个数或者后继结点个数称为该结点的度。 2.树的度:树中所有结点的度的最大值称之为树的度。 3.分支结点:度大于0的结点称为分支结点或非终端结点。 4.叶子结点:度为0的结点称为叶子结点或终端结点。 5.孩子结点:一个结点的后继称之为该结点的孩子结点。 6.双
12、亲结点:一个结点称为其后继结点的双亲结点。 7.子孙结点:一个结点的所有子树中的结点称之为该结点的子孙结点。 8.祖先结点:从树根结点到达某个结点的路径上通过的所有结点称为该结点的祖先结点。 9.兄弟结点:具有同一双亲的结点互相称之为兄弟结点。 10.结点层数:树具有一种层次结构,根结点为第一层,其孩子结点为第二层,如此类推得到每个结点的层数。 11.树的深度:树中结点的最大层数称为树的深度或高度。 12.有序树和无序树:如果一棵树中各结点的各子树从左到右是有次序的,即若交换了某结点各子树的相对位置则构成了不同的树,那么称这棵树为有序树,反之则为无序树。 13.森林:0个或多个不相交的树的集合
13、称为森林。3.二叉树的定义:二叉树是指树的度为2的有序树。4.二叉树的性质: 二叉树上叶子结点数等于度为2的结点数加1。 二叉树上第i层上至多有2的(i-1)次方个结点。 深度为h的二叉树至多有2的h次方-1个结点。 对完全二叉树中编号为i(1=i=1,n为结点数)的结点有: 1.若2idata=ch;p-lchild=p-rchild=NULL; if (bt=NULL) bt=p; else switch(k) case 1:Sttop-lchild=p;break; case 2:Sttop-rchild=p;break; j+; ch=strj; 2.求二叉树的高度运算算法: int
14、BTHeight(BTNode *bt) int lchilddep,rchilddep; if (bt=NULL) return(0); else lchilddep=BTHeight(bt-lchild); rchilddep=BTHeight(bt-rchild); return(lchilddeprchilddep)?(lchilddep+1):(rchilddep+1); 3.求二叉树结点个数运算算法 int NodeCount(BTNode *bt) int num1,num2; if (bt=NULL) return 0; else num1=NodeCount(bt-lchil
15、d); num2=NodeCount(bt-rchild); return (num1+num2+1); 4.求二叉树叶子结点个数运算算法 int LeafCount(BTNode *bt) int num1,num2; if (bt=NULL) return 0; else if(btlchild=NULL & bt-rchild=NULL) return 1; else num1=LeafCount(bt-lchild); num2=LeafCount(bt-rchild); return (num1+num2); 5.以括号表示法输出二叉树运算算法 过程:对于非空二叉树bt,先输出其元素
16、值,当存在左孩子结点或右孩子结点时,输出一个“(”符号,然后递归处理左子树,输出一个“,”符号,递归处理右子树,最后输出一个“)”符号。 void DispBTree (BTNode *bt) if (bt!=NULL) coutdata; if (bt-lchild!=NULL | btrchild!=NULL) coutlchild); if (bt-rchild!=NULL) coutrchild); cout-1) p=Sttop; /退栈并凹入显示该结点值 n=Leveltop0; switch(Leveltop1) case 0:type=L;break; /左节点之后输出(L)
17、case 1:type=R;break; /右结点之后输出(R) case 2:type=B;break; /根结点之后输出(B) for (i=1;i=n;i+) /其中n为显示长宽,字符以右对其显示 cout ; coutdata(type); for (i=n+1;i=MaxWidth;i+=2) cout-; coutrchild!=NULL) /将右子树根结点入栈 top+; Sttop=p-rchild; Leveltop0=n+width; /长宽增width,即缩width格后再输出 Leveltop1=1; if (p-lchild!=NULL) /将左子树根结点入栈 top
18、+; Sttop=p-lchild; Leveltop0=n+width; /显示长宽增width Leveltop1=0; /0表示是左子树 8.二叉树遍历: 1.先序遍历 1.访问根结点 2.先序遍历左子树 3.先序遍历右子树 void PreOrder(BTNode *bt) if (bt!=NULL) coutdata; PreOrder(bt-lchild); PreOrder(bt-rchild); 采用先序遍历得到的访问结点序列称为先序遍历序列,先序编列的特点是:其第一个元素值为二叉树中跟结点的数据值 2.中序遍历 1.中序遍历左子树 2.访问根结点 3.中序遍历右子树 void
19、 InOrder (BTNode *bt) if (bt!=NULL) InOrder (bt-lchild); coutdata; InOrder(bt-rchild); 采用中序遍历得到的访问结点序列成为中序遍历序列,中序遍历序列的特点是:若已知二叉树的根结点数值,以该数据值为界,将中序遍历序列分为两部分,前半部分为左子树的中序遍历序列,后半部分为右子树的中序遍历序列。 3.后序遍历 1.后序遍历左子树 2.后序遍历右子树 3.访问根结点 void PostOrder(BTNode *bt) if(bt!=NULL) PostOrder(bt-lchild); PostOrder(bt-rchild); coutdata; 特点是最后一个元素值为二叉树中根结点的数据值9.假设以二叉链作为储存结构,设计一个算法求二叉树的宽度。宽度是指二叉树中各层上具有结点个数最多的那一层上的结点总数 先采用先序遍历求出每层的宽度,放在a数组中,然后再求出最大宽度即二叉树的宽度 void
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1