广义表形式的二叉树输入,形如:A(B(C(,),F),G(H,I))。即为前序遍历格式
程序假设输入无空格,每个节点使用一个字母表示使用递归和状态机来进行处理
// Author: Haiping Huang
// Assume input contains no white space and each node is represented by one character
// read console input or "./in.txt" (toggle by macro: READFILE)
// Sample input: A(B(C(,),F),G(H,I))
//
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
typedef struct BiTNode
{
char data;
struct BiTNode* lchild, *rchild;
} BiTNode, *BiTNodePtr;
BiTNode* CreateBiTNode()
{
BiTNode* node = (BiTNode*) malloc(sizeof(BiTNode));
node->data = 0;
node->lchild = node->rchild = NULL;
return node;
}
void FreeBiTNode(BiTNode* node)
{
free(node);
}
// test function
void PreOrderTraverse(const BiTNode* root)
{
if (root)
{
printf("%c", root->data);
PreOrderTraverse(root->lchild);
PreOrderTraverse(root->rchild);
}
}
BiTNode* _createTree(char** p)
{
BiTNode* root = NULL;
if (isalpha(**p))
{
root = CreateBiTNode();
root->data = **p;
++(*p);
}
if (**p == '(')
{
++(*p);
if (root)
{
root->lchild = _createTree(p);
}
else
{
printf("Error input!");
exit(1);
}
}
else
{
// quit recursive event
return root;
}
if (**p == ',')
{
++(*p);
if (root)
{
root->rchild = _createTree(p);
}
else
{
printf("Error input!");
exit(1);
}
}
else
{
printf("Error input!");
exit(1);
}
if (**p == ')')
{
++(*p);
return root;
}
else
{
printf("Error input!");
exit(1);
}
return root;
}
BiTNode* CreateBiTree(char* input)
{
char* p = input;
return _createTree(&p);
}
int main(int argc, char* argv[])
{
FILE* in;
#ifdef READFILE
in = fopen("in.txt", "r");
#else
in = stdin;
#endif
char input[512];
fscanf(in, "%s", input);
BiTNode* root = CreateBiTree(input);
PreOrderTraverse(root);
return 0;
}