学习ING

M 叉树

设 M 叉树采用列表法表示,即每棵子树对应一个列表,列表的结构为:子树根结点的值部分(设为一个字符) 和用“( )”,括起来的各子树的列表 (如有子树的话) ,各子列表间用“,”,分隔。例如下面的三叉树可用列表 a( b( c,d ),e,f( g,h,i ))表示。本程序输入列表,生成一棵 M 叉树,并由 M 叉树输出列表。假定输入无错误。

#include <iostream>

#include <stdio.h>

#include <stdlib.h>
#define M 3

using namespace std;

typedef struct node{
char val;
struct node *subTree[M];
} NODE;

char buf[255], *str = buf;
NODE *d = NULL;

NODE *makeTree( ) /*由列表生成M叉树*/
{
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 = k+1;
   } while (k < M);
}
return s;
}

void walkTree(NODE *t) /*由 M 叉树输出列表*/
{
if (t != NULL)
{
   putchar(t->val);
   if ( t -> subTree[0] == NULL )
    return ;
   putchar ( '(' ) ;
   for (int i = 0 ; i < M ; i++)
   {
    walkTree(t->subTree[i]);
    if ( i != M-1 && t->subTree[i+1] != NULL )
     putchar ( ',' ) ;
   }
   putchar ( ')' );
}
}

int main()
{
printf( "Enter exp:" ) ;
scanf( "%s" , str ) ;
d = makeTree() ;
walkTree(d) ;
putchar( '\n');
return 0;
}

posted @ 2010-03-28 20:38  祝雄锋  阅读(1423)  评论(0编辑  收藏  举报