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

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

二分法查找二叉树方法:左大右小,找不到的时候就分支限定的查找 #include

#include

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

return NULL;}

else{

newnode = (b_tree) malloc(sizeof(treenode));//申请空间

newnode->data=nodelist[position];//建立节点内容

//cout 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;

}

else

return NULL;

}

//二叉树二分查找法

b_tree btree_travesal_search1(b_tree point, int findnode)

{

while(point!=NULL)

{

if(point->data==findnode)//找到了数据

return point;//返回找到节点的指针

else

if(point->data>findnode)

{point=point->left;}//向左子树找

else {point=point->right;}//向右子树找

}

return NULL;

}

void inoder(b_tree point)

{

if(point!=NULL)

{

inoder(point->left);

cout 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

printf(" The finding node value is [%d]\n",point->data);

}

else

printf("\nTravesal search result: NOT found!!\n");

//二分查找

point = btree_travesal_search1(root,findnode);

if(point!=NULL)

{

cout

printf(" The finding node value is [%d]\n",point->data);

}

else cout

inoder(root);

/*

for(i=1;i

cout

cout

//打印树状结构连表的内容

//cout

inoder(root);*/

system("PAUSE");

return EXIT_SUCCESS;

}

#include

#include

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

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 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

cout

cout

//打印树状结构连表的内容

//cout

inoder(root);

system("PAUSE");

return EXIT_SUCCESS;

}

注:递归的构建二叉树只是单独的递归调用构造函数,并没有按照一定的大小比较规则进行排序。

二叉树后序遍历的思想:

从根节点开始,沿左子树一直走到没有左孩子的节点为止,

并将所经[节点]的地址第一次进栈;

当找到没有左孩子的节点时,此节点的左子树已访问完毕;

从栈顶退出该节点,判断该节点是否为第一次进栈,如是,再

将所经[节点]的地址第二次进栈,并沿该节点的右子树一直走到

没有右孩子的节点为止,如否,则访问该节点;此时,该节点的

左、右子树都已完全遍历,且令指针p = NULL;

如此重复到栈空为止。

例如有如上图所示二叉树,则后序遍历的顺序是:O J / I * H + G A 实现程序如下:

#include

#include

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 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

{ 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 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

postoder(root);

system("PAUSE");

return EXIT_SUCCESS;

}

#include

#include

#include

#include

#include

#include #include #include #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

{ 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(c6);

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

{ 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(*M).mu||T.j(*M).nu)

flag=1;

if(T.i

flag=1;

}while(flag);

(*M).data[i]=T;

}

for(i=1;i

for(T.i=0;T.i

(*M).rpos[(*M).data[i].i-T.i]=i;

for(i=(*M).data[(*M).tu].i+1;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

{

for(j=1;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

{

(*Q).rpos[k]=(*Q).tu+1;

p=M.rpos[k];

q=N.rpos[k];

while(p

{

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

{

++(*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

{

++(*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

{

++(*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.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

{

for(ccol=1;ccol

ctemp[ccol]=0;

(*Q).rpos[arow]=(*Q).tu+1;

for(p=M.rpos[arow];p

{

brow=M.data[p].j;

for(q=N.rpos[brow];q

{

ccol=N.data[q].j;

ctemp[ccol]+=M.data[p].e*N.data[q].e;

}

}

for(ccol=1;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

for(t=1;t

cpot[1]=1;

for(col=2;col

for(p=1;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

for(i=1;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

printf("N.chead\n\nN.rhead\n");

for(i=1;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

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

while(array[i]

if(i

swap(&array[i], &array[middle]);

middle = i;

}

while(array[j] > array[middle]) --j;

if(i

swap(&array[j], &array[middle]);

middle = j;

}

}

return middle;

}

int quicksort(int *array, int low, int high)

{

int piovt_pos;

if(low

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

min = min

max = max > data[i] ? max : data[i];

}

int num = (max - min + 1)/10 + 1;

barrel *pBarrel = new barrel[num];

for(int i=0; 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

quicksort((pBarrel+i)->a, 0, (pBarrel+i)->count-1);

for(int j=0; jcount; ++j) {

data[pos++] = (pBarrel+i)->a[j];

}

}

for(int i=0; i

printf("%d ", data[i]);

}

return 0;

}

简单来说,就是把数据分组,放在一个个的桶中,然后对每个桶里面的在进行排序。 例如要对大小为[1..1000]范围内的n个整数A[1..n]排序

可以把桶设为大小为10的范围,具体而言,设集合B[1]存储[1..10]的整数,集合B[2]存储

(10..20]的整数,……集合B[i]存储( (i-1)*10, i*10]的整数,i = 1,2,..100。总共有 100个桶。

然后对A[1..n]从头到尾扫描一遍,把每个A[i]放入对应的桶B[j]中。

然后再对这100个桶中每个桶里的数字排序,这时可用冒泡,选择,乃至快排,一般来说任

何排序法都可以。最后依次输出每个桶里面的数字,且每个桶中的数字从小到大输出,这 样就得到所有数字排好序的一个序列了。

假设有n个数字,有m个桶,如果数字是平均分布的,则每个桶里面平均有n/m个数字。如果

对每个桶中的数字采用快速排序,那么整个算法的复杂度是

O(n + m * n/m*log(n/m)) = O(n + nlogn - nlogm)

从上式看出,当m接近n的时候,桶排序复杂度接近O(n)

当然,以上复杂度的计算是基于输入的n个数字是平均分布这个假设的。这个假设是很强的

,实际应用中效果并没有这么好。如果所有的数字都落在同一个桶中,那就退化成一般的 排序了。

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

二分法查找二叉树方法:左大右小,找不到的时候就分支限定的查找 #include

#include

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

return NULL;}

else{

newnode = (b_tree) malloc(sizeof(treenode));//申请空间

newnode->data=nodelist[position];//建立节点内容

//cout 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;

}

else

return NULL;

}

//二叉树二分查找法

b_tree btree_travesal_search1(b_tree point, int findnode)

{

while(point!=NULL)

{

if(point->data==findnode)//找到了数据

return point;//返回找到节点的指针

else

if(point->data>findnode)

{point=point->left;}//向左子树找

else {point=point->right;}//向右子树找

}

return NULL;

}

void inoder(b_tree point)

{

if(point!=NULL)

{

inoder(point->left);

cout 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

printf(" The finding node value is [%d]\n",point->data);

}

else

printf("\nTravesal search result: NOT found!!\n");

//二分查找

point = btree_travesal_search1(root,findnode);

if(point!=NULL)

{

cout

printf(" The finding node value is [%d]\n",point->data);

}

else cout

inoder(root);

/*

for(i=1;i

cout

cout

//打印树状结构连表的内容

//cout

inoder(root);*/

system("PAUSE");

return EXIT_SUCCESS;

}

#include

#include

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

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 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

cout

cout

//打印树状结构连表的内容

//cout

inoder(root);

system("PAUSE");

return EXIT_SUCCESS;

}

注:递归的构建二叉树只是单独的递归调用构造函数,并没有按照一定的大小比较规则进行排序。

二叉树后序遍历的思想:

从根节点开始,沿左子树一直走到没有左孩子的节点为止,

并将所经[节点]的地址第一次进栈;

当找到没有左孩子的节点时,此节点的左子树已访问完毕;

从栈顶退出该节点,判断该节点是否为第一次进栈,如是,再

将所经[节点]的地址第二次进栈,并沿该节点的右子树一直走到

没有右孩子的节点为止,如否,则访问该节点;此时,该节点的

左、右子树都已完全遍历,且令指针p = NULL;

如此重复到栈空为止。

例如有如上图所示二叉树,则后序遍历的顺序是:O J / I * H + G A 实现程序如下:

#include

#include

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 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

{ 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 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

postoder(root);

system("PAUSE");

return EXIT_SUCCESS;

}

#include

#include

#include

#include

#include

#include #include #include #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

{ 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(c6);

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

{ 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(*M).mu||T.j(*M).nu)

flag=1;

if(T.i

flag=1;

}while(flag);

(*M).data[i]=T;

}

for(i=1;i

for(T.i=0;T.i

(*M).rpos[(*M).data[i].i-T.i]=i;

for(i=(*M).data[(*M).tu].i+1;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

{

for(j=1;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

{

(*Q).rpos[k]=(*Q).tu+1;

p=M.rpos[k];

q=N.rpos[k];

while(p

{

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

{

++(*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

{

++(*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

{

++(*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.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

{

for(ccol=1;ccol

ctemp[ccol]=0;

(*Q).rpos[arow]=(*Q).tu+1;

for(p=M.rpos[arow];p

{

brow=M.data[p].j;

for(q=N.rpos[brow];q

{

ccol=N.data[q].j;

ctemp[ccol]+=M.data[p].e*N.data[q].e;

}

}

for(ccol=1;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

for(t=1;t

cpot[1]=1;

for(col=2;col

for(p=1;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

for(i=1;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

printf("N.chead\n\nN.rhead\n");

for(i=1;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

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

while(array[i]

if(i

swap(&array[i], &array[middle]);

middle = i;

}

while(array[j] > array[middle]) --j;

if(i

swap(&array[j], &array[middle]);

middle = j;

}

}

return middle;

}

int quicksort(int *array, int low, int high)

{

int piovt_pos;

if(low

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

min = min

max = max > data[i] ? max : data[i];

}

int num = (max - min + 1)/10 + 1;

barrel *pBarrel = new barrel[num];

for(int i=0; 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

quicksort((pBarrel+i)->a, 0, (pBarrel+i)->count-1);

for(int j=0; jcount; ++j) {

data[pos++] = (pBarrel+i)->a[j];

}

}

for(int i=0; i

printf("%d ", data[i]);

}

return 0;

}

简单来说,就是把数据分组,放在一个个的桶中,然后对每个桶里面的在进行排序。 例如要对大小为[1..1000]范围内的n个整数A[1..n]排序

可以把桶设为大小为10的范围,具体而言,设集合B[1]存储[1..10]的整数,集合B[2]存储

(10..20]的整数,……集合B[i]存储( (i-1)*10, i*10]的整数,i = 1,2,..100。总共有 100个桶。

然后对A[1..n]从头到尾扫描一遍,把每个A[i]放入对应的桶B[j]中。

然后再对这100个桶中每个桶里的数字排序,这时可用冒泡,选择,乃至快排,一般来说任

何排序法都可以。最后依次输出每个桶里面的数字,且每个桶中的数字从小到大输出,这 样就得到所有数字排好序的一个序列了。

假设有n个数字,有m个桶,如果数字是平均分布的,则每个桶里面平均有n/m个数字。如果

对每个桶中的数字采用快速排序,那么整个算法的复杂度是

O(n + m * n/m*log(n/m)) = O(n + nlogn - nlogm)

从上式看出,当m接近n的时候,桶排序复杂度接近O(n)

当然,以上复杂度的计算是基于输入的n个数字是平均分布这个假设的。这个假设是很强的

,实际应用中效果并没有这么好。如果所有的数字都落在同一个桶中,那就退化成一般的 排序了。


相关文章

  • 高中数学二分法查找教案
  • 二分法查找教学设计 江苏省东台中学 朱世华 一.教学课题 第三章第三节<二分法查找>--算法与程序设计(新课标教科书:教育科学出版社) 二.教材及学者分析 <二分法查找>这部分知识在新课程数学必修1中已经涉及到,在前 ...查看


  • 猜字游戏,随机数的产生,二分法查找
  • 6.            猜字游戏,随机数的产生,二分法查找 /*玩猜字游戏*/ #include #include #include main() { /*定义变量,num存储随机变量,i存储输入值*/ int num,i; /*产生随 ...查看


  • 分布式元数据组织方式
  • 分布式元数据组织方式 1. 名字空间概述 名字空间(Namespace )即文件系统文件目录的组织方式,是文件系统的重要组成部分,为用户提供可视化,可理解的文件系统视图,从而解决或降低人类与计算机之间在数据存储上的语义间隔.目前树状结构的文 ...查看


  • 数据结构填空题题库
  • 1. 线性结构中元素之间存在着(一对一)关系,树型结构中元素之间存在着(一对多)关系. 2. 评价数据结构的两条基本标准是:(存储需要量)和(运算的时间效率). 3. 算法的五个特性是指(有穷性/确定性.可行性.输入和输出). 4. 数据的 ...查看


  • [二分法]教学设计
  • <二分法>教学设计 一.教学内容 本节课选自<普通高中课程标准实验教科书数学1必修本(A 版)>的第三章3.1.2用二分法求方程的近似解. 二.设计思想 1.倡导积极主动.勇于探索的学习精神和合作探究式的学习方式: ...查看


  • 基于贪婪算法的自动排课表系统的研究与实现
  • 第29卷第18期Vol.29 No.18 计算机工程与设计 ComputerEngineeringandDesign 2008年9月Sept.2008 基于贪婪算法的自动排课表系统的研究与实现 王帮海1,2,李振坤1 (1.广东工业大学计算 ...查看


  • 考点1:数据结构与算法
  • A )所谓算法就是计算方法 B )程序可以作为算法的一种描述方法 C )算法设计只需考虑得到计算结果 D )算法设计可以忽略算法的运算时间 题目解析:算法是一组有穷指令集,是解题方案的准确而完整的描述.通俗地说,算法就是计算机解题的过程, ...查看


  • 网络线路时通时断故障的解决
  • 网络线路时通时断故障的解决 在广域网日常维护工作中,最令网管员头痛的就是广域网线路发生时通时断故障.由于广域网线路涉及本端用户.本端线路运营商.对端线路运营商和对端用户四个环节,中间经过的网络通信设备较多,引起线路时通时断故障的原因也较多, ...查看


  • 数据结构导论试题1
  • 全国2004年10月高等教育自学考试 1.要将现实生活中的数据转化为计算机所能表示的形式,其转化过程依次为( ) A.逻辑结构.存储结构.机外表示 B.存储结构.逻辑结构.机外表示 C.机外表示.逻辑结构.存储结构 D.机外表示.存储结构. ...查看


热门内容