二叉树查找二分法查找二叉树.docx
- 文档编号:12714229
- 上传时间:2023-04-21
- 格式:DOCX
- 页数:31
- 大小:30.89KB
二叉树查找二分法查找二叉树.docx
《二叉树查找二分法查找二叉树.docx》由会员分享,可在线阅读,更多相关《二叉树查找二分法查找二叉树.docx(31页珍藏版)》请在冰豆网上搜索。
二叉树查找二分法查找二叉树
二叉树查找-二分法查找二叉树
二分法查找二叉树方法:
左大右小,找不到的时候就分支限定的查找
#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="<
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<
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< 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(node {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< } } 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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 二叉 查找 二分法