#include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define MAXSIZE 100 /* 存储空间初始分配量 */ typedef int Status; typedef char TElemType; /* 假定二叉树的元素都是字符类型*/ TElemType Nil = ' '; typedef struct BiTNode { TElemType data; struct BiTNode *lchild,*rchild; }BiTNode,*BiTree; /* 模拟生成char数组, 用于构造二叉树所生产的数据***************/ int index$ = 1; typedef char String[24]; String str; /* 将chars 用String结构体表示*/ Status StrAssign(String S,char *chars) { int i; if (strlen(chars) > MAXSIZE) { return ERROR; // 超过了最大容量 } else { // 第一个位置存放字符串的长度 S[0] = strlen(chars); for (i= 1; i < S[0]; i++) { S[i] = *(chars + i -1); } return OK; } } /* ******************************************************/ /* 构造空的的二叉树T */ Status InitBiTree(BiTree *T) { *T = NULL; return OK; } /* 构造二叉树T, 使用的是递归创建的方法 */ void CreateBiTree(BiTree *T) { if (index$ == strlen(str)) // 所有的元素都分配完毕, 即结束 return; TElemType ch = str[index$++]; if (ch == '#') { // 碰到#号, 停止生成新的结点 *T = NULL; } else { *T = (BiTree)malloc(sizeof(BiTNode)); if (!*T){ exit(OVERFLOW); // malloc失败 } (*T)->data = ch; // 生成根节点 CreateBiTree(&(*T)->lchild); // 构造左子树 CreateBiTree(&(*T)->rchild); // 构造右子树 } } /* 前序遍历*/ void PreOrderTraverse(BiTree *T) { if (*T == NULL) return; printf("%c ",(*T)->data); PreOrderTraverse(&(*T)->lchild); PreOrderTraverse(&(*T)->rchild); } int main() { BiTree T; InitBiTree(&T); // 构造字符串 StrAssign(str,"ABDH#K###E##CFI###G#J##"); // 构造二叉树 CreateBiTree(&T); PreOrderTraverse(&T); return 0; }