二叉树查找二分法查找二叉树.docx

上传人:b****1 文档编号:12714229 上传时间:2023-04-21 格式:DOCX 页数:31 大小:30.89KB
下载 相关 举报
二叉树查找二分法查找二叉树.docx_第1页
第1页 / 共31页
二叉树查找二分法查找二叉树.docx_第2页
第2页 / 共31页
二叉树查找二分法查找二叉树.docx_第3页
第3页 / 共31页
二叉树查找二分法查找二叉树.docx_第4页
第4页 / 共31页
二叉树查找二分法查找二叉树.docx_第5页
第5页 / 共31页
点击查看更多>>
下载资源
资源描述

二叉树查找二分法查找二叉树.docx

《二叉树查找二分法查找二叉树.docx》由会员分享,可在线阅读,更多相关《二叉树查找二分法查找二叉树.docx(31页珍藏版)》请在冰豆网上搜索。

二叉树查找二分法查找二叉树.docx

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

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

二分法查找二叉树方法:

左大右小,找不到的时候就分支限定的查找

#include

#include

usingnamespacestd;

structtree{//声明树的结构

structtree*left;

intdata;

structtree*right;

};

typedefstructtreetreenode;//声明新类型的树的结构

typedeftreenode*b_tree;//声明二叉树的链表

/*递归建立二叉树*/

b_treecreat_btree(int*nodelist,intposition)//看好了某些定义b_tree

{

b_treenewnode;//声明树根指针

if(nodelist[position]==0||position>15)

{//cout<<"d";

returnNULL;}

else{

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

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

//cout<<"newnode="<data;

newnode->left=creat_btree(nodelist,2*position);//递归建立左子树

newnode->right=creat_btree(nodelist,2*position+1);//递归建立右子树

returnnewnode;

}

}

//建立二叉树

//二叉树遍历方式查找

b_treebtree_travesal_search(b_treepoint,intfindnode)

{

b_treepoint1,point2;//声名往左和往右查询的指针

if(point!

=NULL)

{

if(point->data==findnode)

returnpoint;

else

//找左子树

point1=btree_travesal_search(point->left,findnode);

//找右子树

point2=btree_travesal_search(point->right,findnode);

if(point1!

=NULL)

returnpoint1;

elseif(point2!

=NULL)

returnpoint2;

elsereturnNULL;

}

else

returnNULL;

}

//二叉树二分查找法

b_treebtree_travesal_search1(b_treepoint,intfindnode)

{

while(point!

=NULL)

{

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

returnpoint;//返回找到节点的指针

else

if(point->data>findnode)

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

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

}

returnNULL;

}

voidinoder(b_treepoint)

{

if(point!

=NULL)

{

inoder(point->left);

cout<data<<"";

inoder(point->right);

}

};

intmain(intargc,char*argv[])

{

b_treeroot=NULL;//树根指针

b_treepoint=NULL;

intfindnode;

inti;

intnodelist[16]={0,5,2,9,0,4,7,0,0,0,3,0,6,8,0,0};

//---------------建立树状结构-----------//

root=creat_btree(nodelist,1);//建立

printf("\nThenodecontentofarrary_structureis:

\n");

printf("\nPleaseinputthenodevalue(1...9)youwantsearch:

");

scanf("%d",&findnode);

//进行遍历查找

point=btree_travesal_search(root,findnode);

if(point!

=NULL)

{

cout<<"\n=Travesalsearchresult:

\n";

printf("Thefindingnodevalueis[%d]\n",point->data);

}

else

printf("\nTravesalsearchresult:

NOTfound!

!

\n");

//二分查找

point=btree_travesal_search1(root,findnode);

if(point!

=NULL)

{

cout<<"\n=Binarysearchresult:

\n";

printf("Thefindingnodevalueis[%d]\n",point->data);

}

elsecout<<"\nBinarysearchnotfound!

!

\n";

inoder(root);

/*

for(i=1;i<16;i++)

cout<

cout<

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

//cout<<"\nThepostodertravesalresultis";

inoder(root);*/

system("PAUSE");

returnEXIT_SUCCESS;

}

#include

#include

usingnamespacestd;

structtree{//声明树的结构

structtree*left;

intdata;

structtree*right;

};

typedefstructtreetreenode;//声明新类型的树的结构

typedeftreenode*b_tree;//声明二叉树的链表

b_treecreat_btree(int*nodelist,intposition)//看好了某些定义b_tree

{

b_treenewnode;//声明树根指针

if(nodelist[position]==0||position>15)

{cout<<"d";returnNULL;}

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);//递归建立右子树

returnnewnode;

}

}

//建立二叉树

voidinoder(b_treepoint)

{

if(point!

=NULL)

{

inoder(point->left);

cout<data<<"";

inoder(point->right);

}

}

intmain(intargc,char*argv[])

{

b_treeroot=NULL;//树根指针

inti;

intnodelist[16]={0,5,9,2,1,4,7,0,0,0,3,0,6,8,0,0};

//---------------建立树状结构-----------//

root=creat_btree(nodelist,1);

printf("\nThenodecontentofarrary_structureis:

\n");

for(i=1;i<16;i++)

cout<

cout<

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

//cout<<"\nThepostodertravesalresultis";

inoder(root);

system("PAUSE");

returnEXIT_SUCCESS;

}

注:

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

二叉树后序遍历的思想:

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

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

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

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

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

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

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

如此重复到栈空为止。

例如有如上图所示二叉树,则后序遍历的顺序是:

OJ/I*H+GA

实现程序如下:

#include

#include

usingnamespacestd;

structtree{//声明树的结构

structtree*left;

intdata;

structtree*right;

};

typedefstructtreetreenode;//声明新类型的树的结构

typedeftreenode*b_tree;//声明二叉树的链表

b_treeinsert_node(b_treeroot,intnode)//看好了某些定义b_tree

{

b_treenewnode;//声明树根指针

b_treecurrentnode;//声明目前节点指针

b_treeparentnode;//声明父亲接点指针

//建立新节点的内存空间

newnode=(b_tree)malloc(sizeof(treenode));

//建立新节点的内存空间

newnode->data=node;//存入节点的内容

newnode->right=NULL;//设置右指针的初值

newnode->left=NULL;//设置左指针的初值

if(root==NULL)returnnewnode;

else

{

currentnode=root;

while(currentnode!

=NULL)

{

parentnode=currentnode;

if(nodedata)//比较节点的数值大小

{currentnode=currentnode->left;}//坐子树

elsecurrentnode=currentnode->right;//右子树

}//寻找空的节点便插入

if(parentnode->data>node)

{parentnode->left=newnode;}

elseparentnode->right=newnode;//插入了哈哈

}

returnroot;

}

//建立二叉树

b_treecreat_btree(int*data,intlen)

{

b_treeroot=NULL;//根节点指针

inti;

for(i=0;i

{root=insert_node(root,data[i]);}

returnroot;

}

//打印二叉树

/*voidprint_btree(b_treeroot)

{

b_treepointer;

pointer=root->left;

printf("Printleft_subtreenodeofroot:

\n");

while(pointer!

=NULL)

{

printf("[%2d]\n",pointer->data);

pointer=pointer->left;//指向左节点

}

pointer=root->right;

printf("Printright_subtreenodeofroot:

\n");

while(pointer!

=NULL)

{

printf("[%2d]\n",pointer->data);//打印节点的内容

pointer=pointer->right;//指向右节点

}

}*/

voidpostoder(b_treepoint)

{

if(point!

=NULL)

{

postoder(point->left);//左--右--根

postoder(point->right);

cout<data<<"";

}

}

intmain(intargc,char*argv[])

{

b_treeroot=NULL;

inti,index;

intvalue;

intnodelist[20];

printf("\nPleaseinputtheelsementsofbinarytree(Exitfor0):

\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<<"\nThepostodertravesalresultis";

postoder(root);

system("PAUSE");

returnEXIT_SUCCESS;

}

#include

#include

#include

#include

#include

#include

#include

#include

#defineOK1

#defineERROR0

#defineMAXSIZE100

#defineMAXRC20

typedefintStatus;

typedefintElemType;

typedefstruct

{

inti,j;

ElemTypee;

}Triple;

typedefstruct

{

Tripledata[MAXSIZE+1];

intrpos[MAXRC+1];

intmu,nu,tu;

}RLSMatrix;

typedefstructOLNode

{

inti,j;

ElemTypee;

structOLNode*right,*down;

}OLNode,*OLink;

typedefstruct

{

OLink*rhead,*chead;

intmu,nu,tu;

}CrossList;

StatusCreateSMatrix(RLSMatrix*M);

voidDestroySMatrix(RLSMatrix*M);

voidPrintSMatrix(RLSMatrixM);

StatusADD(RLSMatrixM,RLSMatrixN,RLSMatrix*Q);

StatusSubtS(RLSMatrixM,RLSMatrixN,RLSMatrix*Q);

StatusMult(RLSMatrixM,RLSMatrixN,RLSMatrix*Q);

StatusFastTransposeSMatrix(RLSMatrixM,RLSMatrix*T);

intmenu_select();

StatusOperate(RLSMatrixA,RLSMatrixB,RLSMatrix*C);

StatusExchange(RLSMatrixM,CrossList*N);

StatusShow(CrossListN);

StatusChange(RLSMatrixA,RLSMatrixB,RLSMatrixC,CrossList*M);

StatusDestoryCrossList(CrossList*M);

voidAbout();

main()

{

RLSMatrixA,B,C;

CrossListN;

clrscr();

About();

for(;;)

{

switch(menu_select())

{

case1:

clrscr();

printf("\n\n\n\t-------------CreateSparseMatrixA-----------------");

CreateSMatrix(&A);break;

case2:

clrscr();

printf("\n\n\n\t-------------CreateSparseMatrixB-----------------");

CreateSMatrix(&B);break;

case3:

Operate(A,B,&C);

break;

case4:

Change(A,B,C,&N);break;

case5:

About();break;

case6:

DestroySMatrix(&A);

DestroySMatrix(&B);

DestroySMatrix(&C);

DestoryCrossList(&N);

exit(0);

}

}

}

intmenu_select()

{

char*menu[]={

"",

"",

"",

"+--------------MENU--------------+",

"||",

"|1.CreateSparseMatrixA|",

"|2.CreateSparseMatrixB|",

"|3.Operate|",

"|4.ChangeintoCrossList|",

"|5.About...|",

"|6.Quit|",

"||",

"||",

"+-----------------------------------+",

"ByTeacher",

"10/10/07",};

chars[3];

intc,i;

gotoxy(1,25);

printf("Anykeytoentermenu......\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("\nEnteryourchoice(1~6):

");

scanf("%s",s);

c=atoi(s);

}while(c<1||c>6);

returnc;

}

StatusCreateSMatrix(RLSMatrix*M)

{

inti;

TripleT;

intflag=0,mis;

printf("\nPleaseinputtherow,col,andnonzeroelementnumberoftheSparseMatrix.");

printf("\nForm:

rownum,colnum,nonzeroelementnum\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("ERRORINPUT!

\n");

flag=0;

mis++;}

if(mis==3)

{

printf("FailCreate!

");

returnOK;}

printf("Pleaseinputtherow,colandvalueofthe%dthnonzeroelement:

",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);

returnOK;

}

voidPrintSMatrix(RLSMatrixM)

{

inti,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++;}

elseprintf("0\t");

while(j==M.nu)

{printf("\n");break;}

}

}

}

StatusADD(RLSMatrixM,RLSMatrixN,RLSMatrix*Q)

{

intk,p,q;

if(M.mu!

=N.mu||M.nu!

=N.nu)retu

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1