1、大题目50/折半查找 51二叉排序树中的算法 52构造二叉排序树的算法 53二叉排序树上的查找(动态查找) 54二叉排序树的删除递归算法 55定义线性链表的数据类型 56双向链表删除 57双向链表的插入 58二叉链表的定义 59需用到栈,顺序栈的定义如下 60二叉树结点个数 61按层次遍历二叉树的定义 62后继线索化处理前驱结点 63前驱线索化处理后继结点 64孩子兄弟表示法 65队列的定义 66队列的删除1线形表的插入 2线形表的删除 3单链表的查找 4单链表的插入 5单链表的删除 6入栈 7出栈 8链栈的入栈 9链栈的出栈 10汉诺塔 11入队 12出队 13划分子集 14先序遍历二叉树的
2、递归算法 15中序遍历二叉树的递归算法 16后序遍历二叉树的递归算法 17先序遍历的非递归算法 18中序遍历的非递归算法 19后序遍历的非递归算法 20先序建立二叉树的递归算法 21二叉树的显示输出 22利用二叉树后序遍历计算二叉树的深度 23求二叉树结点个数 24按层次遍历二叉树 25左右子树互换 26复制二叉树 27线索二叉树的存储表示 28遍历中序线索二叉树 29遍历先序线索二叉树 30遍历后序线索二叉树(不带头结点) 31通过中序遍历建立中序线索化二叉树 32通过中序遍历建立中序线索化二叉树 33中序线索化 34先序线索化 35后序线索化 36建立赫夫曼树及求赫夫曼编码的算法 37建立
3、邻接矩阵 38邻接表存储表示 39网络 (带权图) 的邻接表 41整个图的DFS遍历 42图的广度优先搜索算法 43利用普里姆算法建立最小生成树 44拓扑排序的算法 45利用关键路径法求AOE网的各关键活动 49二叉排序树的数据类型描述 50/折半查找int Search_Bin(SSTable ST,KeyType key) int low,high,mid; low = 1; high=ST.length; while (low data.key data.key) p = p-lchild; else p = p-rchild; if (S-data.key data.key) q-lc
4、hild = S; else q-rchild = S; return; 52构造二叉排序树的算法void CreateBST( BiTree &T ) int x; BiTree S; T=NULL; scanf ( “%d”,&x); while (x!=0 ) S = (BiTNode *) malloc(sizeof(BitNode); S-data.key = x; S-lchild = NULL; S-rchild = NULL; Insert_BST( T,S ); scanf ( “%d”,&x); return; 53二叉排序树上的查找(动态查找)int Searh_BST(
5、 BiTree T, int key ) BiTree p, q, S, p = T; while ( p ) if ( p-data.key = key ) return(1); else if ( p-data.key key) q=p; p=p-lchild; else q=p; p=p-rchild; S = (BiTNode *) malloc(sizeof(BitNode); S-data.key = key; S-lchild=S-rchild=NULL; if (!T) T=S; else if ( q-data.key key ) q-lchild=S; else q-rch
6、ild=S; return(0); 54二叉排序树的删除递归算法(算法9.7)int DeleteBST(BiTree &T,KeyType key) if (!T) return FALSE; else if (EQ(key,T-data.key) return Delete(T); else if (LT(key,T-data.key) return DeleteBST(T-lchild,key); else return DeleteBST(T-rchild,key); 55定义线性链表的数据类型typedef struct LNode ElemType data; struct LNo
7、de *next;LNode,*LinkList56双向链表删除Status ListDelete_Dul(DuLinkList &L,int i,ElemType &e) if (! (p=GetElemP_Dul(L,i) return ERROR; e =p-data; p-prior-next= p-next; p-next-prior= p-prior; free( p ); return OK57双向链表的插入Status ListInsert_Dul(DuLinkList &L,int i,ElemType e) if (! (p=GetElemP_Dul(L,i) return
8、 ERROR; if (! (s= (DuLinkList)malloc(sizeof(DuLNode) return ERROR s-data=e; s-prior=p-prior; p-prior-next=s; s-next=p; p-prior=s; return OK58二叉链表的定义typedef struct BiTNode TElemType data;Struct BiTNode *lchild,*rchild;BiTNode, *BiTree;59需用到栈,顺序栈的定义如下:typedef BiTNode* SElemType;typedef struct SElemTyp
9、e *base; SElemType *top; int stacksize;SqStack;60二叉树结点个数int Size(BiTree T) if (T=NULL) return 0; else return 1 + Size (T-lchild ) + Size ( T-rchild);61按层次遍历二叉树的定义typedef BiTNode* ElemType;typedef struct QElemType *base; int front,rear;SqQueue62后继线索化处理前驱结点void InThreading(BiThrTree P) if (P) InThread
10、ing(P-lchild); if (!P-rchild) P-RTag=Thread; if (pre & pre-RTag=Thread) pre-rchild=P; pre=P; InThreading(P-rchild); 63前驱线索化处理后继结点void InThreading(BiThrTree P) if (P) InThreading (P-lchild); if (!P-lchild) P-LTag=Thread; P-lchild=pre; pre=P; InThreading(P-rchild); 64孩子兄弟表示法typedef struct CSNodeElemTy
11、pe data;struct CSNode *firstchild, *nextsibling;CSNode,*CSTree;65队列的定义typedef struct QNode QElemType data; struct QNode *next;QNode,*QueuePtr;Typedef structQueuePtr front;QueuePtr rear;LinkQueue;66队列的删除Status Dequeue(LinkQueue &Q,QelemType &e)If(Q.front=Q.rear)return ERROR;P=Q.front-next;e=p-data;Q.
12、front-next=p-nextIf(Q.rear=p)Q.rear=q.front;Free(P);Renturn OK;1线形表的插入int sxbcr(int i,int x,int v,int *p) int j,n; n=*p; if(in+1) return (0); else for(j=n;j=i;j-) vj=vj-1; vj=x; *p=+n; return (1); 2线形表的删除int sxbsc(int i,int v,int *p) int j,n; n=*p; if(in) return (0); else for(j=i;jdata!=X) p=p-next;
13、 return (p);4单链表的插入void dlbcr(LNode *p,int x) LNode *s; s=(LNode *)malloc(sizeof(LNode); s-data=x; s-next=p-next; p-next=s;5单链表的删除void dlbsc(LNode *p) LNode *q; if(p-next!=NULL) q=p-next; p-next=q-next; free(q); LNode * dlbjl(int a,int n) LinkList *s,*h; int i; h=(LNode *)malloc(sizeof(LNode); h-dat
14、a=0; h-next=NULL; for(i=n;i0;i-) s=(LNode *)malloc(sizeof(LNode); s-data=ai-1; s-next=h-next; h-next=s; return (h);6入栈int push(SqStack &S,SElemType e)/插入元素e为新的棧顶元素 if(S.top-S.base=S.stacksize) S.base=(ElemType*)realloc(S.base,(S.stacksize+STACKINCREAMENT)*sizeof(ElemType); if(!S.base) exit(OVERFLOW)
15、; S.top=S.base+S.stacksize; S.stacksize+=STACKINCREAMENT; *S.top+=e; return OK;7出栈int Pop(SqStack &S,SElemType &e) if(S.top=S.base) return ERROR; e=*-S.top; return OK;8链栈的入栈QNode *lzjz(QNode *top,int x) QNode *p; p=(QNode *)malloc(sizeof(QNode); p-data=x; p-next=top; top=p; return(p);9链栈的出栈JD *lztz(
16、JD *top,int *p) JD *q; if(top!=NULL) q=top; *p=top-data; top=top-link; free(q); return(top);10汉诺塔/*Hanoi.txt*/ main() int m; printf(Input the number of disks:); scanf(%d,&m); printf(The steps to moving %3d disks:n,m); hanoi(m,A,B,C);(0) void hanoi(int n,char x,char y,char z)(1) (2) if(n=1)(3) move(1
17、,x,z);(4) else(5) hanoi(n-1,x,z,y);(6) move(n,x,z);(7) hanoi(n-1,y,x,z);(8) (9) void move(int h,char c,char f) printf(%d:%c-%cn,h,c,f); 11入队QNode *dlcr(QNode *rear,int x) QNode *p; p=(QNode *)malloc(sizeof(QNode); p-data=x; p-next=NULL; rear-next=p; return(p);12出队int dlsc(QNode *front,QNode *rear) Q
18、Node *s; int x; if(front=rear) return(-1); s=front-next; front-next=s-next; if(s-next=NULL) rear=front; x=s-data; free(s); return(x);13划分子集void division(int rN,int n,int cq, int newr,int result) int k,i,pre,group; for(k=0;kn;k+) cqk=k+1; front=n-1; rear=n-1; for(k=0;kn;k+) newrk=0; group=1; pre=0; d
19、o front=(front+1)%n; i=cqfront; if(ipre) group+; resulti-1=group; for(k=0;kn;k+) newrk=ri-1k; else if(newri-1!=0) rear=(rear+1)%n; cqrear=i; else resulti-1=group; for(k=0;kdata); PreOrderTraverse(T-lchild); PreOrderTraverse(T-rchild); 15中序遍历二叉树的递归算法 void InOrderTraverse(BiTree T) if (T) InOrderTrave
20、rse(T-lchild); printf(%c,T-data); InOrderTraverse(T-rchild); 16后序遍历二叉树的递归算法 void PostOrderTraverse(BiTree T) if (T) PostOrderTraverse(T-lchild); PostOrderTraverse(T-rchild); printf(%c,T-data); 17先序遍历的非递归算法 void preorder(BiTree T) SqStack S; BiTree P=T; InitStack(S); Push(S,NULL); while (P) printf(%c
21、,P-data); if (P-rchild) Push(S,P-rchild); if (P-lchild) P=P-lchild; else Pop(S,P); 18中序遍历的非递归算法1 void inorder(BiTree T) SqStack S; BiTree P=T; InitStack(S); do while(P) * (S.top) = P; S.top+; P=P-lchild; if (S.top) S.top-; P=*(S.top); printf(%c,P-data); P=P-rchild; while(S.top!=S.base) | P);19后序遍历的非
22、递归算法1 void Postorder(BiTree T) BiTree p=T,q=NULL; SqStack S; InitStack(S); Push(S,p); while (!StackEmpty(S) if (p & p!=q) Push(S,p); p=p-lchild; else Pop(S,p); if (!StackEmpty(S) if (p-rchild & p-rchild!=q) Push(S,p); p=p-rchild; else printf(%c,p-data); q=p; 20先序建立二叉树的递归算法(p131,算法6.4) Status CreateB
23、iTree(BiTree &T) char ch; scanf(%c,&ch); if (ch= ) T=NULL; else if (!(T=(BiTNode*)malloc(sizeof(BiTNode) exit(OVERFLOW); T-data = ch; CreateBiTree(T-lchild); CreateBiTree(T-rchild); return OK;21二叉树的显示输出void PrintBiTree(BiTree T,int n) int i; char ch= ; if (T) PrintBiTree(T-rchild,n+1); for (i=1;idat
24、a); PrintBiTree(T-lchild,n+1); 22利用二叉树后序遍历计算二叉树的深度int Depth(BiTree T) int depl,depr; if (T) depl=Depth(T-lchild); depr=Depth(T-rchild); if (depl=depr) return (depl+1); else return (depr+1); return 0; 23求二叉树结点个数int Size(BiTree T) if (T=NULL) return 0; else return 1 + Size (T-lchild ) + Size ( T-rchil
25、d);24按层次遍历二叉树void LevelOrderTraverse(BiTree T) BiTree p; SqQueue Q; InitQueue(Q); if (T) Q.baseQ.rear=T; Q.rear=(Q.rear+1)%MAXQSIZE; while (Q.front !=Q.rear) p=Q.baseQ.front; printf(%c,p-data); Q.front=(Q.front+1)%MAXQSIZE; if (p-lchild) Q.baseQ.rear=p-lchild; Q.rear=(Q.rear+1)%MAXQSIZE; if (p-rchil
26、d) Q.baseQ.rear=p-rchild; Q.rear=(Q.rear+1)%MAXQSIZE; 25左右子树互换 void Exchange(BiTree &T) BiTree S; if (T) S=T-lchild; T-lchild=T-rchild; T-rchild=S; Exchange(T-lchild); Exchange(T-rchild); 26复制二叉树 void CopyTree(BiTree T,BiTree &T1) if (T) T1=(BiTree)malloc(sizeof(BiTNode); if (!T1) printf(Overflown); exit(1); T1-data=T-data; T1-lchild=T1-rchild=NULL;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1