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);
}
#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);
}
相关文章推荐
- C语言的快速排序算法代码-递归实现
- 递归下降分析法的简单例子的c语言实现
- 【c语言】递归实现strlen函数
- 【c语言】递归实现厄密多项式
- [算法]简单的背包问题递归解法,C语言实现
- 全排列---递归实现与分析(C语言)
- 全排列--字典序列、递归方法c语言实现
- 字符串拷贝函数递归与非递归的C语言实现
- 递归方式实现打印一个整数的每一位(C语言)
- C语言实现二叉树的递归遍历与非递归遍历
- 数据结构基础(6)--递归和函数调用--汉诺塔问题C语言实现
- 树和二叉树---C语言利用栈实现二叉树的递归、非递归的前、中、后序遍历
- 【经典问题】汉诺塔(递归、C语言实现)
- 【C语言】编写一个函数reverse_string(char * string)(递归实现
- 用递归实现角股定理 C语言
- C语言递归和非递归实现字符串反转
- C语言 ---- 递归实现二分查找
- 二叉树遍历的递归和非递归实现(C语言)
- 数据结构-二路归并-递归实现-C语言
- 递归和非递归分别实现求第n个斐波那契数(C语言)