当前位置:文档之家› 二叉树查找-二分法查找二叉树

二叉树查找-二分法查找二叉树

二叉树查找-二分法查找二叉树二分法查找二叉树方法:左大右小,找不到的时候就分支限定的查找#include <cstdlib>#include <iostream>using namespace std;struct tree{ // 声明树的结构struct tree *left;int data;struct tree *right;};typedef struct tree treenode;//声明新类型的树的结构typedef treenode *b_tree;//声明二叉树的链表/*递归建立二叉树*/b_tree creat_btree(int *nodelist,int position)//看好了某些定义b_tree {b_tree newnode;//声明树根指针if(nodelist[position]==0||position>15){//cout <<"d";return NULL;}else{newnode = (b_tree) malloc(sizeof(treenode));//申请空间newnode->data=nodelist[position];//建立节点内容//cout << " newnode=" << newnode->data;newnode->left=creat_btree(nodelist,2*position); //递归建立左子树newnode->right=creat_btree(nodelist,2*position+1);//递归建立右子树return newnode;}}//建立二叉树//二叉树遍历方式查找b_tree btree_travesal_search(b_tree point,int findnode){b_tree point1,point2;//声名往左和往右查询的指针if(point!=NULL){if(point->data==findnode)return point;else//找左子树point1=btree_travesal_search(point->left,findnode);//找右子树point2=btree_travesal_search(point->right,findnode);if(point1 != NULL)return point1;else if(point2!=NULL)return point2;else return NULL;}elsereturn NULL;}//二叉树二分查找法b_tree btree_travesal_search1(b_tree point, int findnode){while(point!=NULL){if(point->data==findnode)//找到了数据return point;//返回找到节点的指针elseif(point->data>findnode){point=point->left;}//向左子树找else {point=point->right;}//向右子树找}return NULL;}void inoder(b_tree point){if(point!=NULL){inoder(point->left);cout << point->data<<" ";inoder(point->right);}};int main(int argc, char *argv[]){b_tree root = NULL;//树根指针b_tree point = NULL;int findnode;int i;int nodelist[16]={0,5,2,9,0,4,7,0,0,0,3,0,6,8,0,0};//---------------建立树状结构-----------//root = creat_btree(nodelist,1); //建立printf("\n The node content of arrary_structure is:\n");printf("\nPlease input the node value(1...9) you want search:");scanf("%d",&findnode);//进行遍历查找point=btree_travesal_search(root,findnode);if(point!=NULL){cout << "\n=Travesal search result: \n";printf(" The finding node value is [%d]\n",point->data); }elseprintf("\nTravesal search result: NOT found!!\n");//二分查找point = btree_travesal_search1(root,findnode);if(point!=NULL){cout << "\n=Binary search result: \n";printf(" The finding node value is [%d]\n",point->data); }else cout << "\nBinary search not found!!\n";inoder(root);/*for(i=1;i<16;i++)cout << nodelist[i] <<" ";cout <<endl;//打印树状结构连表的内容//cout <<"\nThe postoder travesal result is";inoder(root);*/system("PAUSE");return EXIT_SUCCESS;}#include <cstdlib>#include <iostream>using namespace std;struct tree{ // 声明树的结构struct tree *left;int data;struct tree *right;};typedef struct tree treenode;//声明新类型的树的结构typedef treenode *b_tree;//声明二叉树的链表b_tree creat_btree(int *nodelist,int position)//看好了某些定义b_tree {b_tree newnode;//声明树根指针if(nodelist[position]==0||position>15){cout <<"d";return NULL;}else{newnode = (b_tree) malloc(sizeof(treenode));//申请空间newnode->data=nodelist[position];//建立节点内容newnode->left=creat_btree(nodelist,2*position); //递归建立左子树newnode->right=creat_btree(nodelist,2*position+1);//递归建立右子树return newnode;}}//建立二叉树void inoder(b_tree point){if(point!=NULL){inoder(point->left);cout << point->data<<" ";inoder(point->right);}}int main(int argc, char *argv[]){b_tree root = NULL;//树根指针int i;int nodelist[16]={0,5,9,2,1,4,7,0,0,0,3,0,6,8,0,0};//---------------建立树状结构-----------//root = creat_btree(nodelist,1);printf("\n The node content of arrary_structure is:\n");for(i=1;i<16;i++)cout << nodelist[i] <<" ";cout <<endl;//打印树状结构连表的内容//cout <<"\nThe postoder travesal result is";inoder(root);system("PAUSE");return EXIT_SUCCESS;}注:递归的构建二叉树只是单独的递归调用构造函数,并没有按照一定的大小比较规则进行排序。

二叉树后序遍历的思想:从根节点开始,沿左子树一直走到没有左孩子的节点为止,并将所经[节点]的地址第一次进栈;当找到没有左孩子的节点时,此节点的左子树已访问完毕;从栈顶退出该节点,判断该节点是否为第一次进栈,如是,再将所经[节点]的地址第二次进栈,并沿该节点的右子树一直走到没有右孩子的节点为止,如否,则访问该节点;此时,该节点的左、右子树都已完全遍历,且令指针p = NULL;如此重复到栈空为止。

例如有如上图所示二叉树,则后序遍历的顺序是:O J / I * H + G A 实现程序如下:#include <cstdlib>#include <iostream>using namespace std;struct tree{ // 声明树的结构struct tree *left;int data;struct tree *right;};typedef struct tree treenode;//声明新类型的树的结构typedef treenode *b_tree;//声明二叉树的链表b_tree insert_node(b_tree root,int node)//看好了某些定义b_tree {b_tree newnode;//声明树根指针b_tree currentnode;//声明目前节点指针b_tree parentnode;//声明父亲接点指针//建立新节点的内存空间newnode = (b_tree) malloc(sizeof(treenode));//建立新节点的内存空间newnode->data=node;//存入节点的内容newnode->right=NULL;//设置右指针的初值newnode->left=NULL;//设置左指针的初值if(root == NULL) return newnode;else{currentnode = root;while(currentnode!=NULL){parentnode = currentnode;if(node < currentnode->data)//比较节点的数值大小{currentnode = currentnode->left;}//坐子树else currentnode =currentnode->right;//右子树}//寻找空的节点便插入if(parentnode->data > node){parentnode->left = newnode;}else parentnode->right = newnode;//插入了哈哈}return root;}//建立二叉树b_tree creat_btree(int *data,int len){b_tree root = NULL;//根节点指针int i;for(i=0;i<len;i++)//建立树状结构{ root=insert_node(root,data[i]);}return root;}//打印二叉树/*void print_btree(b_tree root){b_tree pointer;pointer = root->left;printf("Print left_subtree node of root:\n"); while(pointer!=NULL){printf("[%2d]\n",pointer->data);pointer = pointer->left;//指向左节点}pointer = root->right;printf("Print right_subtree node of root:\n"); while(pointer!=NULL){printf("[%2d]\n",pointer->data);//打印节点的内容pointer = pointer->right;//指向右节点}}*/void postoder(b_tree point){if(point!=NULL){postoder(point->left);//左--右--根postoder(point->right);cout << point->data<<" ";}}int main(int argc, char *argv[]){b_tree root = NULL;int i,index;int value;int nodelist[20];printf("\n Please input the elsements of binary tree (Exit for 0):\n"); index = 0;scanf("%d",&value);while (value!= 0){nodelist[index]=value;index++;scanf("%d",&value);}root= creat_btree(nodelist,index);//建立二叉树// print_btree(root);//打印二叉树节点的内容cout <<"\nThe postoder travesal result is";postoder(root);system("PAUSE");return EXIT_SUCCESS;}#include <string.h>#include <ctype.h>#include <malloc.h>#include <stdio.h>#include <stdlib.h>#include <conio.h>#include <mem.h>#include <alloc.h>#define OK 1#define ERROR 0#define MAXSIZE 100#define MAXRC 20 typedef int Status;typedef int ElemType; typedef struct{int i,j;ElemType e;}Triple;typedef struct{Triple data[MAXSIZE+1]; int rpos[MAXRC+1];int mu,nu,tu;}RLSMatrix;typedef struct OLNode{int i,j;ElemType e;struct OLNode *right,*down; }OLNode,*OLink;typedef struct{OLink *rhead,*chead;}CrossList;Status CreateSMatrix(RLSMatrix *M);void DestroySMatrix(RLSMatrix *M);void PrintSMatrix(RLSMatrix M);Status ADD(RLSMatrix M,RLSMatrix N,RLSMatrix *Q);Status SubtS(RLSMatrix M,RLSMatrix N,RLSMatrix *Q);Status Mult(RLSMatrix M,RLSMatrix N,RLSMatrix *Q);Status FastTransposeSMatrix(RLSMatrix M,RLSMatrix *T);int menu_select();Status Operate(RLSMatrix A,RLSMatrix B,RLSMatrix *C);Status Exchange(RLSMatrix M,CrossList *N);Status Show(CrossList N);Status Change(RLSMatrix A,RLSMatrix B,RLSMatrix C,CrossList *M); Status DestoryCrossList(CrossList *M);void About();main(){RLSMatrix A,B,C;CrossList N;clrscr();About();for(;;){switch(menu_select()){case 1:clrscr();printf("\n\n\n\t-------------Create Sparse Matrix A-----------------"); CreateSMatrix(&A); break;printf("\n\n\n\t-------------Create Sparse Matrix B-----------------"); CreateSMatrix(&B); break;case 3:Operate(A,B,&C);break;case 4:Change(A,B,C,&N); break;case 5:About();break;case 6:DestroySMatrix(&A);DestroySMatrix(&B);DestroySMatrix(&C);DestoryCrossList(&N);exit(0);}}}int menu_select(){char *menu[]={"","",""," +--------------MENU--------------+"," | |"," | 1.Create Sparse Matrix A |"," | 2.Create Sparse Matrix B |"," | 3.Operate |"," | 4.Change into CrossList |"," | 5.About... |"," | 6.Quit |"," | |"," | |"," +-----------------------------------+"," By Teacher"," 10/10/07",};char s[3];int c,i;gotoxy(1,25);printf("Any key to enter menu......\n"); getch();clrscr();for(i=0;i<16;i++){ gotoxy(10,i+1);cprintf("%s",menu[i]);}window(1,1,80,25);gotoxy(10,21);do{printf("\n Enter your choice(1~6):"); scanf("%s",s);c=atoi(s);}while(c<1||c>6);return c;}Status CreateSMatrix(RLSMatrix *M) {int i;Triple T;int flag=0,mis;printf("\nPlease input the row,col,and nonzero element number of the Sparse Matrix."); printf("\nForm:row num,col num,nonzero element num\n");scanf("%d,%d,%d",&(*M).mu,&(*M).nu,&(*M).tu);(*M).data[0].i=0;for(i=1;i<=(*M).tu;i++){ mis=0;do{if(flag){printf("ERROR INPUT!\n");flag=0;mis++;}if(mis==3){printf("Fail Create !");return OK;}printf("Please input the row,col and value of the %dth nonzero element:",i);scanf("%d,%d,%d",&T.i,&T.j,&T.e);if(T.i<1||T.i>(*M).mu||T.j<1||T.j>(*M).nu)flag=1;if(T.i<(*M).data[i-1].i||T.i==(*M).data[i-1].i&&T.j<=(*M).data[i-1].j)flag=1;}while(flag);(*M).data[i]=T;}for(i=1;i<=(*M).tu;i++)for(T.i=0;T.i<(*M).data[i].i-(*M).data[i-1].i;T.i++)(*M).rpos[(*M).data[i].i-T.i]=i;for(i=(*M).data[(*M).tu].i+1;i<=(*M).mu;i++)(*M).rpos[i]=(*M).tu+1;PrintSMatrix(*M);return OK;}void PrintSMatrix(RLSMatrix M){int i,j,k;printf("\n ");for(i=1,k=1;i<=M.mu;i++){for(j=1;j<=M.nu;j++){if(M.data[k].i==i&&M.data[k].j==j){printf("%d\t",M.data[k].e); k++;}else printf("0\t");while(j==M.nu){printf("\n ");break;}}}}Status ADD(RLSMatrix M,RLSMatrix N,RLSMatrix *Q) {int k,p,q;if(M.mu!=N.mu||M.nu!=N.nu) return ERROR;(*Q).mu=M.mu;(*Q).nu=M.nu;(*Q).tu=0;M.rpos[M.mu+1]=M.tu+1;N.rpos[N.mu+1]=N.tu+1;for(k=1;k<=M.mu;++k){(*Q).rpos[k]=(*Q).tu+1;p=M.rpos[k];q=N.rpos[k];while(p<M.rpos[k+1]&&q<N.rpos[k+1]){if(M.data[p].j==N.data[q].j){(*Q).data[(*Q).tu+1].e=M.data[p].e+N.data[q].e; if((*Q).data[(*Q).tu+1].e!=0){++(*Q).tu;(*Q).data[(*Q).tu].i=k;(*Q).data[(*Q).tu].j=M.data[p].j;}++p;++q;}else if(M.data[p].j<N.data[q].j){++(*Q).tu;(*Q).data[(*Q).tu].e=M.data[p].e;(*Q).data[(*Q).tu].i=k;(*Q).data[(*Q).tu].j=M.data[p].j;++p;}else{++(*Q).tu;(*Q).data[(*Q).tu].e=N.data[q].e;(*Q).data[(*Q).tu].i=k;(*Q).data[(*Q).tu].j=N.data[q].j;++q;}}while(p<M.rpos[k+1]){++(*Q).tu;(*Q).data[(*Q).tu].e=M.data[p].e;(*Q).data[(*Q).tu].i=k;(*Q).data[(*Q).tu].j=M.data[p].j;++p;}while(q<N.rpos[k+1]){++(*Q).tu;(*Q).data[(*Q).tu].e=N.data[q].e;(*Q).data[(*Q).tu].i=k;(*Q).data[(*Q).tu].j=N.data[q].j;++q;}}return OK;}Status SubtS(RLSMatrix M,RLSMatrix N,RLSMatrix *Q){int i;if(M.mu!=N.mu||M.nu!=N.nu) return ERROR;for(i=1;i<=N.tu;++i)N.data[i].e*=-1;ADD(M,N,Q);return OK;}Status Mult(RLSMatrix M,RLSMatrix N,RLSMatrix *Q) {int arow,brow,p,q,ccol,ctemp[MAXRC+1];if(M.nu!=N.mu) return ERROR;(*Q).mu=M.mu;(*Q).nu=N.nu;(*Q).tu=0;M.rpos[M.mu+1]=M.tu+1;N.rpos[N.mu+1]=N.tu+1;if(M.tu*N.tu!=0){for(arow=1;arow<=M.mu;++arow){for(ccol=1;ccol<=(*Q).nu;++ccol)ctemp[ccol]=0;(*Q).rpos[arow]=(*Q).tu+1;for(p=M.rpos[arow];p<M.rpos[arow+1];++p){brow=M.data[p].j;for(q=N.rpos[brow];q<N.rpos[brow+1];++q){ccol=N.data[q].j;ctemp[ccol]+=M.data[p].e*N.data[q].e;}}for(ccol=1;ccol<=(*Q).nu;++ccol)if(ctemp[ccol]){if(++(*Q).tu>MAXSIZE) return ERROR;(*Q).data[(*Q).tu].i=arow;(*Q).data[(*Q).tu].j=ccol;(*Q).data[(*Q).tu].e=ctemp[ccol];}}}return OK;}Status FastTransposeSMatrix(RLSMatrix M,RLSMatrix *T) {int col,p,q,t,num[MAXRC+1],cpot[MAXRC+1];(*T).mu=M.nu;(*T).nu=M.mu;(*T).tu=M.tu;if((*T).tu){for(col=1;col<=M.nu;++col) num[col]=0;for(t=1;t<=M.tu;++t) ++num[M.data[t].j];cpot[1]=1;for(col=2;col<=M.nu;++col) cpot[col]=cpot[col-1]+num[col-1]; for(p=1;p<=M.tu;++p){col=M.data[p].j; q=cpot[col];(*T).data[q].i=M.data[p].j;(*T).data[q].j=M.data[p].i;(*T).data[q].e=M.data[p].e;++cpot[col];}}PrintSMatrix(M);printf("\nTranspose:\n");PrintSMatrix(*T);return OK;}Status Operate(RLSMatrix A,RLSMatrix B,RLSMatrix *C){int c;char t;do{clrscr();printf("\nInput your choice:\n(ADD--1,SUB--2,MUL--3,Transpose A--4,Transpose B--5,QUIT--any except 1~5)\n");scanf("%d",&c);switch(c){case 1:if(A.mu!=B.mu||A.nu!=B.nu){printf("Can't,condition misfit!\n");break;}ADD(A,B,C);PrintSMatrix(A);printf("\n\t(+)\n");PrintSMatrix(B);printf("\n\t(=)\n");PrintSMatrix(*C);break;case 2:if(A.mu!=B.mu||A.nu!=B.nu) {printf("Can't,condition misfit!\n"); break;}SubtS(A,B,C);PrintSMatrix(A);printf("\n\t(-)\n");PrintSMatrix(B);printf("\n\t(=)\n");PrintSMatrix(*C);break;case 3:if(A.nu!=B.mu){printf("Can't,condition misfit\n"); break;}Mult(A,B,C);PrintSMatrix(A);printf("\n\t(*)\n");PrintSMatrix(B);printf("\n\t(=)\n");PrintSMatrix(*C);break;case 4:FastTransposeSMatrix(A,C);break;case 5:FastTransposeSMatrix(B,C);break;default: return OK;}/* switch */printf("Want to continue? (y/n)?");t=getch();}while(t=='y');return OK;}void DestroySMatrix(RLSMatrix *M){(*M).mu=0;(*M).nu=0;(*M).tu=0;}Status Exchange(RLSMatrix M,CrossList *N){int i;OLNode *p,*Q;(*N).mu=M.mu;(*N).nu=M.nu;(*N).tu=M.tu;(*N).rhead=(OLink*)malloc((MAXRC+1)*sizeof(OLink)); (*N).chead=(OLink*)malloc((MAXRC+1)*sizeof(OLink));for(i=1;i<=10;i++) {(*N).rhead[i]=NULL;(*N).chead[i]=NULL;} for(i=1;i<=M.tu;i++){Q=(OLNode*)malloc(sizeof(OLNode));Q->i=M.data[i].i;Q->j=M.data[i].j;Q->e=M.data[i].e;if(!(*N).rhead[M.data[i].i]){(*N).rhead[M.data[i].i]=Q;Q->right=NULL;}else{for(p=(*N).rhead[M.data[i].i];p->right;p=p->right); p->right=Q;Q->right=NULL;}if(!(*N).chead[M.data[i].j]){(*N).chead[M.data[i].j]=Q;Q->down=NULL;}else{for(p=(*N).rhead[M.data[i].j];p->down;p=p->down); p->down=Q;Q->down=NULL;}}return OK;}Status Show(CrossList N){int i,j,sub;int x,y;OLNode *q;printf("\n\n ");for(i=1;i<=N.nu;i++) printf(" --- ");printf("N.chead\n\nN.rhead\n");for(i=1;i<=N.mu;i++){if(N.rhead[i]){q=N.rhead[i];printf(" |");for(j=0;q;j=q->j,q=q->right){sub=q->j-j;while(sub>1){printf("-----------");sub--;}printf("--->|%d|%d|%d|",q->i,q->j,q->e);x=wherex();y=wherey();gotoxy(x-4,y-1);printf("V",x);gotoxy(x-4,y-2);printf("|");gotoxy(x,y);}printf("\n\n\n");}else printf(" |^\n\n");;}return OK;}Status Change(RLSMatrix A,RLSMatrix B,RLSMatrix C,CrossList *M) {int cho;clrscr();printf("\n\n\nChoose the RLSMatrix you want to change into CrossList\n"); printf("(1--A,2--B,3--C,any but 123 back) :");scanf("%d",&cho);switch(cho){case 1:Exchange(A,M);Show(*M);break;case 2:Exchange(B,M);Show(*M);break;case 3:Exchange(C,M);Show(*M);break;}return OK;}Status DestoryCrossList(CrossList *M){free((*M).rhead);free((*M).chead);(*M).chead=(*M).rhead=NULL;return OK;}void About(){clrscr();gotoxy(20,10);printf("Made By: \n\n\t\t\t");printf("\ The College of Information Engineering \n\n\t\t\t");printf(" in AnHui University Of Finance & Economics "); }#include <stdio.h>void swap(int *a, int *b){int temp = *a;*a = *b;*b = temp;}int partition(int *array, int low, int high){int middle = (low + high)/2;for(int i=low,j=high; i<j; ) {while(array[i] < array[middle]) ++i;if(i < j && i != middle) {swap(&array[i], &array[middle]);middle = i;}while(array[j] > array[middle]) --j;if(i < j && j != middle) {swap(&array[j], &array[middle]);middle = j;}}return middle;}int quicksort(int *array, int low, int high){int piovt_pos;if(low < high) {piovt_pos = partition(array, low, high);quicksort(array, low, piovt_pos - 1);quicksort(array, piovt_pos + 1, high);}}struct barrel {int a[10];int count;};int main(){int data[] = {23, 12, 3, 54, 1, 98, 24, 34};int min = data[0];int max = data[0];for(int i=1; i<sizeof(data)/sizeof(int); ++i) {min = min < data[i] ? min : data[i];max = max > data[i] ? max : data[i];}int num = (max - min + 1)/10 + 1;barrel *pBarrel = new barrel[num];for(int i=0; i<sizeof(data)/sizeof(int); ++i) {int j = (pBarrel+((data[i]-min+1)/10))->count; (pBarrel+((data[i]-min+1)/10))->a[j] = data[i]; (pBarrel+((data[i]-min+1)/10))->count++;}static int pos = 0;for(int i=0; i<num; ++i) {quicksort((pBarrel+i)->a, 0, (pBarrel+i)->count-1);for(int j=0; j<(pBarrel+i)->count; ++j) {data[pos++] = (pBarrel+i)->a[j];}}for(int i=0; i<8; ++i) {printf("%d ", data[i]);}return 0;}简单来说,就是把数据分组,放在一个个的桶中,然后对每个桶里面的在进行排序。

相关主题