C语言遍历二叉树的递归调用操作集

来源:互联网 发布:java三级证书有用吗 编辑:程序博客网 时间:2024/05/22 03:11

#include <string.h>  
#include <stdio.h>  
#include <malloc.h>    
typedef int ElemType;
  
typedef struct BiTNode  
{  
    ElemType data;  
    struct BiTNode* lchild;  
    struct BiTNode* rchild;  
}BiTNode, *BiTree;  






void createBiTree(BiTree &T)  
{  
    char data;  
    data = getchar();  
    if(data == '#')  
    {  
        T = NULL;  
    }  
    else
{
T=(BiTree)malloc(sizeof(BiTNode));
T->data=data;
createBiTree(T->lchild);
createBiTree(T->rchild);
}
}




void preOrderTraverse(BiTree &T)  //先序遍历递归
{  
    if(T)  
    {  
        printf("%c",T->data);
        preOrderTraverse(T->lchild);
        preOrderTraverse(T->rchild);
    }  
}  


void inOrderTraverse(BiTree &T)   //中序遍历递归
{
if(T)
{
inOrderTraverse(T->lchild);
printf("%c",T->data);
inOrderTraverse(T->rchild);
}
}
void postOrderTraverse(BiTree &T)   //后序遍历递归
{
if(T)
{
postOrderTraverse(T->lchild);
postOrderTraverse(T->rchild);
printf("%c",T->data);
}
}




void destroyTraverse(BiTree &T)   //销毁二叉树递归
{
if(T)
{
   destroyTraverse(T->lchild);
destroyTraverse(T->rchild);
free(T);
T=NULL;
}
}
  




int lengthTraverse(BiTree &T)        //树的深度递归
{
int ldepth;
int rdepth;
if(T==NULL)
{
return 0;
}


ldepth=lengthTraverse(T->lchild);
rdepth=lengthTraverse(T->rchild);


return (ldepth>rdepth)? (ldepth+1):(rdepth+1);
}




int leafnumberTraverse(BiTree &T)    //求树的叶子节点递归
{
if(T==NULL)
{
return 0;
}
if(T->lchild==NULL&&T->rchild==NULL)
   
return 1;
return leafnumberTraverse(T->lchild)+leafnumberTraverse(T->rchild);
}






void exchangechild(BiTree &T)       //交换树的左右孩子递归
{
BiTree temp;
if(T)
{
temp=NULL;
if(T->lchild||T->rchild)
temp=T->lchild;
   T->lchild=T->rchild;
T->rchild=temp;
exchangechild(T->lchild);
exchangechild(T->rchild);




}
}
        


  


int main()  
{  
    BiTree T = NULL; 
    printf("请输入需要建立二叉树的序列:\n"); //大兄弟,如果不能显示那么就是你输入的问题:尝试输入  ABE###CD###     意思就是A( B(E),C(D) )
    createBiTree(T);  
printf("先序递归遍历: "); 
preOrderTraverse(T); 
printf("\n中序递归遍历:");
inOrderTraverse(T);
printf("\n后序递归遍历:");
   postOrderTraverse(T);


        printf("\n树的高度为:%3d\n", lengthTraverse(T));




printf("\n树的 叶子节点个数为:%3d\n",leafnumberTraverse(T));




exchangechild(T);
printf("\n对交换后的数进行先序递归遍历:\n "); 
preOrderTraverse(T); 

return 0;
}  
阅读全文
0 0
原创粉丝点击