算法分析之递归
2008-09-14 20:11
155 查看
要求:
设 M 叉树采用列表法表示,即每棵子树对应一个列表,列表的结构为:子树根结点的值部分 (设为一个字符) 和用“( )”,括起来的各子树的列表 (如有子树的话) ,各子列表间用“,”,分隔。例如下面的三叉树可用列表 a( b( c,d ),e,f( g,h,i ))表示。
<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
写个程序输入列表,生成一棵 M 叉树,并由 M 叉树输出列表。假定输入无错误。
程序如下:
#include"stdio.h"
#include"stdlib.h"
#define M 3
typedef struct node
{
char val;
struct node *subTree[M];
}NODE;
char buf[255],*str=buf;
NODE *d=NULL;
NODE *makeTree()
{
int k;
NODE *s;
s=(NODE*)malloc(sizeof(NODE));
s->val=*str++;
for(k=0;k<M;k++)
s->subTree[k]=NULL;
if(*str==' ( ')
{
k=0;
do{
str++;
s->subTree[k]=makeTree();
if(*str==')')
{
str++;
break;
}
k++;
}while(*str==',');
}
return s;
}
void walkTree(NODE *t)
{
int i;
if(t!=NULL)
{
putchar(t->val);
if(t->subTree[0]==NULL)return;
putchar('(');
for(i=0;i<M;i++)
{
walkTree(t->subTree[i]);
if(i!=M-1&&t->subTree[i+1]!=NULL)
putchar(',');
}
putchar(')');
}
}
void main()
{
printf("Enter exp:");
scanf("%S",str);
d=makeTree();
walkTree(d);
putchar('/n');
}
看是差不多了,可就是没法调试……??
设 M 叉树采用列表法表示,即每棵子树对应一个列表,列表的结构为:子树根结点的值部分 (设为一个字符) 和用“( )”,括起来的各子树的列表 (如有子树的话) ,各子列表间用“,”,分隔。例如下面的三叉树可用列表 a( b( c,d ),e,f( g,h,i ))表示。
<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
写个程序输入列表,生成一棵 M 叉树,并由 M 叉树输出列表。假定输入无错误。
程序如下:
#include"stdio.h"
#include"stdlib.h"
#define M 3
typedef struct node
{
char val;
struct node *subTree[M];
}NODE;
char buf[255],*str=buf;
NODE *d=NULL;
NODE *makeTree()
{
int k;
NODE *s;
s=(NODE*)malloc(sizeof(NODE));
s->val=*str++;
for(k=0;k<M;k++)
s->subTree[k]=NULL;
if(*str==' ( ')
{
k=0;
do{
str++;
s->subTree[k]=makeTree();
if(*str==')')
{
str++;
break;
}
k++;
}while(*str==',');
}
return s;
}
void walkTree(NODE *t)
{
int i;
if(t!=NULL)
{
putchar(t->val);
if(t->subTree[0]==NULL)return;
putchar('(');
for(i=0;i<M;i++)
{
walkTree(t->subTree[i]);
if(i!=M-1&&t->subTree[i+1]!=NULL)
putchar(',');
}
putchar(')');
}
}
void main()
{
printf("Enter exp:");
scanf("%S",str);
d=makeTree();
walkTree(d);
putchar('/n');
}
看是差不多了,可就是没法调试……??
相关文章推荐
- 【转载】2.2基本算法之递归和自调用函数 逆波兰表达式分析—心机深
- 算法中的递归分析和分治法的原理
- 分治与递归(算法分析与设计)
- 算法中的递归分析和分治法的原理
- 算法分析之递归
- ACM算法-时间复杂度分析(5.有关时间复杂度递归的分析)
- 汇编语言实现递归阶乘算法代码分析(8)
- 【算法题】二叉树的前序遍历(递归和非递归算法分析)
- Hanoi Tower汉诺塔问题函数递归算法分析及相应python代码
- 反汇编算法介绍和应用——递归下降算法分析
- java数据结构与算法分析之递归
- 【转载】2.2基本算法之递归和自调用函数 全排列分析—用next_permutation函数,全搞定
- [Java算法分析与设计]二叉树非递归实现遍历
- 算法分析之Ackerman函数的递归实现算法
- 棋盘覆盖问题算法分析与实现(递归)
- 【算法】递归(recursion)+经典例题个人分析
- atof()函数详解----NOI2.2基本算法之递归和自调用函数 逆波兰表达式 分析
- 汉诺塔问题递归算法分析:
- 递归和迭代算法深入分析(入门篇)
- [算法设计与分析]3.1.2递归设计要点(汉诺塔+整数的分划)