二叉树查找二分法查找二叉树.docx
《二叉树查找二分法查找二叉树.docx》由会员分享,可在线阅读,更多相关《二叉树查找二分法查找二叉树.docx(31页珍藏版)》请在冰豆网上搜索。
![二叉树查找二分法查找二叉树.docx](https://file1.bdocx.com/fileroot1/2023-4/19/8365312c-3751-40b1-a57e-2555dce7cc79/8365312c-3751-40b1-a57e-2555dce7cc791.gif)
二叉树查找二分法查找二叉树
二叉树查找-二分法查找二叉树
二分法查找二叉树方法:
左大右小,找不到的时候就分支限定的查找
#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