您的位置:首页 > 编程语言 > C语言/C++

C语言递归实现二叉链表

2013-11-11 17:55 691 查看
#include<stdio.h>

#include<stdlib.h>

typedef struct BiNode

{
char data;
struct BiNode *lchild , *rchild; 

}BiTree;                                      //节点(数据,左孩子,右孩子 )

BiTree *create(BiTree *T)                     //创建二叉链表(递归算法)

{

    char ch;
if((ch = getchar()) == '#')               //按照前序遍历输入,缺少孩子用‘#’补齐
return NULL;                                                        

    else
{
T = (BiTree*)malloc(sizeof(BiTree));
T->data   = ch; 
T->lchild = create(T->lchild);          //递归(左子树)
T->rchild = create(T->rchild);  
return T;                             //递归(右子树)
}

}

void preorder( BiTree *p)                     //前序遍历(递归)

{
if(p!=NULL)
{
printf("%c ",p->data);
preorder(p->lchild)  ;
   preorder(p->rchild)  ;
}

}

void inorder( BiTree *p)                      //中序遍历(递归)

{
if(p!=NULL)
{
inorder(p->lchild)   ;
printf("%c ",p->data);
inorder(p->rchild)   ;
}

}

void postorder( BiTree *p)                   //后序遍历(递归)

{
if(p!=NULL)
{
postorder(p->lchild) ;
postorder(p->rchild) ;
printf("%c ",p->data);
}

}

int depth(BiTree *T)                        //求深度(递归)

{
int d1=0,d2=0,max;
if(T)
{
d1  = depth(T->lchild);
d2  = depth(T->rchild);
max = d1 > d2 ? d1 :d2;
   return max+1;                       //体会两个return 体会max+1
}
return 0;

}

int i = 0;

void freetree(BiTree *T)                    //销毁二叉链表


if(T)
{
freetree(T->lchild);
   freetree(T->rchild);
free(T);
i++;
}

}

void main()                           

{
BiTree *T;
printf("请输入元素(先序遍历),缺少的孩子用‘#’补:\n");

    T = create(T);
printf("前序遍历:");
preorder(T);                          printf("\n");

    printf("中序遍历:");
inorder(T);                           printf("\n");

    printf("后序遍历:");
postorder(T);                         printf("\n");
printf("二叉树的深度:%d",depth(T));  printf("\n");    
freetree(T);
printf("共销毁的节点:%d\n",i);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息