配色: 字号:
C经典程序_二叉树算法集
2013-09-12 | 阅:  转:  |  分享 
  






#include

#include

#defineMAX50

#defineMAS20

#defineCHAR1

#ifCHAR

typedefcharTElemType;

TElemTypeNil='''';

#defineform"%c"

#else

typedefintTElemType;

TElemTypeNil=0;

#defineform"%d"

#endif

typedefstructnode

{TElemTypedata;

structnodeleft;

structnoderight;

structnodeparent;

}BiTNode,BiTree;

BiTNodeInitBiTree(BiTNodebt)

{

bt=NULL;

returnbt;

}

BiTNodeCreateBiTree(BiTNodebt)

{TElemTypech;

scanf(form,&ch);

if(ch==Nil)bt=NULL;

else

{bt=(BiTNode)malloc(sizeof(BiTNode));

if(!bt)exit(0);

bt->data=ch;bt->parent=NULL;

bt->left=CreateBiTree(bt->left);

if(bt->left)bt->left->parent=bt;

bt->right=CreateBiTree(bt->right);

if(bt->right)bt->right->parent=bt;

}

returnbt;

}

voidPrintTree(BiTNodebt,inti)

{if(bt!=NULL)

{PrintTree(bt->right,i+5);

#ifCHAR

if(bt->data!=Nil)

printf("%c\n",i,bt->data);

#else

if(bt->data!=Nil)

printf("%d\n",i,bt->data);

#endif

PrintTree(bt->left,i+5);

i=i-5;

}

}

voidProrder1(BiTNodebt,void(visit)(TElemType))/先序遍历/

{if(bt!=NULL)

{visit(bt->data);

Prorder1(bt->left,visit);

Prorder1(bt->right,visit);

}

}

voidProrder2(BiTNodebt,void(visit)(TElemType))/中序遍历/

{BiTNodep,stack[MAS];

inttop;

top=0;p=bt;

while(top!=0||p!=NULL)

{while(p!=NULL)

{stack[top]=p;top++;

p=p->left;

}

if(top!=0)

{p=stack[top-1];

top--;

visit(p->data);

p=p->right;

}

}

}

voidProrder3(BiTNodebt,void(visit)(TElemType))/后序遍历/

{BiTNodep,stack[MAS];

inttop;

top=0;

stack[top]=bt;top++;

while(top>0)

{p=stack[top-1];top--;

while(p!=NULL)

{visit(p->data);

stack[top]=p->right;

top++;

p=p->left;

}

}

}

voidvisit(TElemTypee)

{printf(form"",e);

}

intSumLefts(BiTNodebt,intsum)

{

if(bt!=NULL)

{

if(bt->left==NULL&&bt->right==NULL)

{

printf("%4c",bt->data);sum++;

}

sum=SumLefts(bt->left,sum);

sum=SumLefts(bt->right,sum);

}

return(sum);

}

intSumTree(BiTNodebt)

{staticintsum=0;

if(bt!=NULL)

{printf("%4c",bt->data);

sum++;

sum=SumTree(bt->left);

sum=SumTree(bt->right);

}

return(sum);

}

BiTNodeFindchar(BiTNodebt,charch)/二叉树查找结点/

{BiTNodep;/利用函数名返回结果/

if(bt!=NULL)

{if(bt->data==ch)p=bt;

p=Findchar(bt->left,ch);

p=Findchar(bt->right,ch);

}

if(p!=NULL)return(p);

elsereturn(NULL);

}



main()

{intj,i,a,sum=0;

BiTreebt;

bt=InitBiTree(bt);

#ifCHAR

printf("请先序输入二叉树(如:ab三个空格表示a为根结点,b为左子树的二叉树)\n");

#else

printf("请先序输入二叉树(如:12000表示1为根结点,2为左子树的二叉树)\n");

#endif

bt=CreateBiTree(bt);

printf("输入建立的二叉树!!!\n");

PrintTree(bt,5);

do{

printf("------------------------------------------------------------");

printf("\n主菜单");

printf("\n1二叉树先序遍历");

printf("\n2二叉树中序遍历");

printf("\n3二叉树后序遍历");

printf("\n4二叉树叶子结点数");

printf("\n5二叉树结点数");

printf("\n6二叉树查找x结点");

printf("\n0退出");

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

printf("\n");

printf("输入你要选择的数据:");

scanf("%d",&i);

switch(i)

{case1:printf("先序遍历结果为:");

Prorder1(bt,visit);

break;

case2:printf("后序遍历结果为:");

Prorder2(bt,visit);

break;

case3:printf("中序遍历结果为:");

Prorder3(bt,visit);

break;

case4:j=SumLefts(bt,sum);

printf("树的叶子结点数为%d:",j);

break;

case5:j=SumTree(bt);

printf("树的结点数为%d:",j);

break;

case6:printf("输入要查找的结点字符x:");

scanf("%c",&a);scanf("%c");

j=Findchar(bt,a);

printf("要查找的结点的指针为%d:",j);

break;

case0:exit(0);

}

printf("\n");

getch();

}while(i>0||i<8);

}



/在这个算法中,分别有二叉树的建立,输出,先序,中序,后序

以及查找叶子结点,所有结点数,查找某结点的指针的算法。

算法中还有很多的不足希望大家能进一步的完善它/

/我还希望能结交一些爱好c编程的朋友,我的qq号为:343012669.

E_mail:zhenji512@126.com/

/我非常希望和大家认识/















献花(0)
+1
(本文系yangshiquan...首藏)