策略是按照#号分割, 先左后右,先左后右....去构造二叉树
C 极简版
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
typedef struct BiNode
{
char data;// 仅用char作为例子
struct BiNode *lchild, *rchild;
}BiNode, *BiTree;
const char *s = "ABDH#K###E##CFI###G#J##";
int _index = 0;
/* 构造二叉树*/
void CreateBiTree(BiTree *T)
{
if (_index == strlen(s)) return;
char ch = s[_index++];
if (ch == '#') {
*T = NULL;
} else {
*T = (BiTree)malloc(sizeof(BiNode));
if (!*T) { exit(OVERFLOW); } // 内存分配失败
(*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;
CreateBiTree(&T);
PreOrderTraverse(&T);
return 0;
}
C 完整版
#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;
}
java 版
public class Demo {
static class BiNode{
String data;
BiNode lchild;
BiNode rchild;
}
String s = "ABDH#K###E##CFI###G#J##";
int index = 0;
/* 构造二叉树*/
public BiNode createBiTree(BiNode node){
if (index == s.length()) return node;
String ch = s.substring(index, index+1);
index++;
if (ch.equals("#")){
node = null;
} else {
node = new BiNode();
node.data = ch;
node.lchild = createBiTree(node.lchild);
node.rchild = createBiTree(node.rchild);
}
return node;
}
/* 前序遍历*/
public void preOrderTraverse(BiNode node){
if (node == null) {
return;
}
System.out.printf("%s ", node.data);
preOrderTraverse(node.lchild);
preOrderTraverse(node.rchild);
}
public static void main(String[] args) {
Demo demo = new Demo();
BiNode root = null;
BiNode after = demo.createBiTree(root);
demo.preOrderTraverse(after);
}
}
public class Demo {
static class BiNode{
String data;
BiNode lchild;
BiNode rchild;
}
String s = "ABDH#K###E##CFI###G#J##";
int index = 0;
/* 构造二叉树*/
public BiNode createBiTree(BiNode node){
if (index == s.length()) return node;
String ch = s.substring(index, index+1);
index++;
if (ch.equals("#")){
node = null;
} else {
node = new BiNode();
node.data = ch;
node.lchild = createBiTree(node.lchild);
node.rchild = createBiTree(node.rchild);
}
return node;
}
/* 前序遍历*/
public void preOrderTraverse(BiNode node){
if (node == null) {
return;
}
System.out.printf("%s ", node.data);
preOrderTraverse(node.lchild);
preOrderTraverse(node.rchild);
}
public static void main(String[] args) {
Demo demo = new Demo();
BiNode root = null;
BiNode after = demo.createBiTree(root);
demo.preOrderTraverse(after);
}
}