您的位置:首页 > 其它

二叉树的建立及遍历各种递归

2011-11-24 21:42 375 查看
递归简直太难了啊




#include<stdio.h>
#include<malloc.h>

#defineOK1
#defineERROR0
#defineTRUE1
#defineFLASE0
#defineOVERFLOW2

typedefintStatus;
#defineTElemTypechar

typedefstructBiTNode{
TElemTypedata;
structBiTNode*lchild,*rchild;//左右孩子指针
}BiTNode,*BiTree;

StatusCreateBiTree(BiTree&T)
{//先序建立二叉树
charch;
scanf("%c",&ch);
if(ch=='')
T=NULL;
else
{
if(!(T=(BiTNode*)malloc(sizeof(BiTNode))))
exit(OVERFLOW);
T->data=ch;
CreateBiTree(T->lchild);//构造左子树
CreateBiTree(T->rchild);//构造右子树
}
returnOK;
}//CreateBiTree

StatusPrintElement(TElemTypee)
{
printf("%c",e);
returnOK;
}//相当于Visit函数

StatusPreOrderTraverse(BiTreeT,Status(*Visit)(TElemTypee))//先序遍历T的递归算法
{
if(T)
{
if(Visit(T->data))
if(PreOrderTraverse(T->lchild,Visit))
if(PreOrderTraverse(T->rchild,Visit))
returnOK;
returnERROR;
}
elsereturnOK;
}//PreOrderTraverse

StatusInOrderTraverse(BiTreeT)//中序递归遍历
{

if(T)
{
InOrderTraverse(T->lchild);//最左节点
printf("%c",T->data);
InOrderTraverse(T->rchild);
}
returnOK;
}

StatusPostOrderTraverse(BiTreeT)//后续递归遍历
{
if(T)
{
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
printf("%c",T->data);
}
returnOK;
}

intLeavesNum(BiTreeT)//递归法求叶子个数
{
if(T)
{
if((T->lchild==NULL)&&(T->rchild==NULL))
{
return1;
}
return(LeavesNum(T->lchild)+LeavesNum(T->rchild));
}
return0;
}

StatusExchange(BiTreeT)//递归法交换树的左右子树
{
BiTreetemp;
if(T)
{
Exchange(T->lchild);
Exchange(T->rchild);
temp=T->lchild;
T->lchild=T->rchild;
T->rchild=temp;
}
returnOK;
}

intDepth(BiTreeT)//求树的高度
{
intlh,rh;
lh=rh=0;
BiTreep=T;
if(p==NULL)
{
return0;
}
else
{
lh=Depth(p->lchild);
rh=Depth(p->rchild);
return(lh>rh?(lh+1):(rh+1));
}
}

intNum_Of_Node(BiTreeT)//求树的结点数
{
if(T==NULL)
return0;
else
returnNum_Of_Node(T->lchild)+Num_Of_Node(T->rchild)+1;
}

intmain()
{
BiTreeT;
printf("以先序序列建树:\n");
CreateBiTree(T);
printf("原树的前、中、后序遍历如下:\n");
PreOrderTraverse(T,PrintElement);
printf("\n");
InOrderTraverse(T);
printf("\n");
PostOrderTraverse(T);
printf("\n");
intleavesnum;
leavesnum=LeavesNum(T);
printf("原树的叶子数为:%d\n",leavesnum);
intdepth;
depth=Depth(T);
printf("原树的深度值为:%d\n",depth);
intnum_of_node;
num_of_node=Num_Of_Node(T);
printf("原树的结点数为:%d\n",num_of_node);

Exchange(T);//交换树的左右结点
printf("交换左右结点后的前中后序遍历为:\n");
PreOrderTraverse(T,PrintElement);
printf("\n");
InOrderTraverse(T);
printf("\n");
PostOrderTraverse(T);
printf("\n");
leavesnum=LeavesNum(T);
printf("交换后的叶子数为:%d\n",leavesnum);
depth=Depth(T);
printf("交换后树的深度为:%d\n",depth);
num_of_node=Num_Of_Node(T);
printf("交换后的结点数为:%d\n",num_of_node);
system("pause");
return0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐