题目描述
我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为b串,全“1”串称为i串,既含“0”又含“1”的串则称为f串。
fbi树是一种二叉树1,它的结点类型也包括f结点,b结点和i结点三种。由一个长度为2^n的“01”串s可以构造出一棵fbi树t,递归的构造方法如下:
1) t的根结点为r,其类型与串s的类型相同;
2) 若串s的长度大于1,将串s从中间分开,分为等长的左右子串s1和s2;由左子串s1构造r的左子树t1,由右子串s2构造r的右子树t2。
现在给定一个长度为2^n的“01”串,请用上述构造方法构造出一棵fbi树,并输出它的后序遍历2序列。
分析:没难度,用递归即可解决
-
#include <stdio.h>
-
#include <stdlib.h>
-
#include <string.h>
-
-
struct fbi_node {
-
char type;
-
struct fbi_node *pleft;
-
struct fbi_node *pright;
-
};
-
-
static char nodetype(char* str, int start, int end)
-
{
-
char type = str[start] == "0" ? 'b' : 'i';
-
int i=start 1;
-
-
while (i <= end)
-
{
-
if (str[i] == str[start])
-
{
-
i;
-
}
-
else
-
return 'f';
-
}
-
return type;
-
}
-
-
static struct fbi_node* parseseries(char* str, int start, int end)
-
{
-
struct fbi_node* root= null;
-
char type = nodetype(str,start,end);
-
-
root = (struct fbi_node*)calloc(sizeof(struct fbi_node), 1);
-
if (null == root)
-
{
-
printf("malloc error\n");
-
return null;
-
}
-
-
root->type = type;
-
if (start < end)
-
{
-
root->pleft = parseseries(str,start, (start end)/2);
-
root->pright = parseseries(str,(startend)/2 1, end);
-
}
-
return root;
-
}
-
-
static void visitfbi_rootlast(struct fbi_node *root)
-
{
-
if (!root)
-
{
-
return;
-
}
-
-
if (root->pleft)
-
{
-
visitfbi_rootlast(root->pleft);
-
}
-
if (root->pright)
-
{
-
visitfbi_rootlast(root->pright);
-
}
-
printf("%c", root->type);
-
}
-
static void destroiyfbitree(struct fbi_node *root)
-
{
-
printf("free nodes[ not implemented]\n");
-
}
-
-
int main(int argc, char** argv)
-
{
-
char* str = "10001011";
-
struct fbi_node *root = parseseries(str, 0, 7);
-
visitfbi_rootlast(root);
-
destroiyfbitree(root);
-
}
阅读(1982) | 评论(0) | 转发(0) |