一、二叉树的储存结构
typedef struct {
int data;//数据域
struct BiTNode* left, * right;//左子树右子树
}BiTNode, * BiTree;
二、按先序序列建立二叉链表
- 读入一个数e
- 如果该数为0,则为空数,T为NULL;否则
- 动态分配一个结点空间
- 将e赋给T->data
- 递归生成T的左子树
- 递归生成T的右子树
- 返回T
BiTree CreatBiTree() {
BiTree T = NULL;//初始化为空树
int e;
scanf("%d", &e);//输入结点值
if (e != 0) {
T = (BiTree)malloc(sizeof(BiTNode));//生成根结点
T->data = e;//结点数据域置为e
T->left = CreatBiTree();//递归生成左子树
T->right = CreatBiTree();//递归生成右子树
}
return T;//返回结点指针
}
再写个先序遍历的递归算法打印生成的二叉树
void PreOrderTraverse(BiTree T) {
if (T == NULL) return;
else {
printf("%d ", T->data);
PreOrderTraverse(T->left);
PreOrderTraverse(T->right);
}
}
运行代码,输入1 2 4 0 0 5 0 0 3 6 0 0 0 如图所示的二叉树
先序序列为1 2 4 5 3 6
还有一种数据域是字符型的二叉树,改下就好了。
但是有个问题很烦,就是输入的时候换行符也会读取进去,就会错误建立许多没用的结点,不会按理论终止递归,所以后面加个getchar(),每次输入一个字符然后换行。getchar()会将换行符吸了。
BiTree CreatBiTree() {
BiTree T = NULL;//初始化为空树
char e;
scanf("%c", &e);//输入结点值
getchar();//用来防止下次错误读取换行符\n
fflush(stdin);//清除缓存流的,好像未定义没作用
if (e != '#') {
T = (BiTree)malloc(sizeof(BiTNode));//生成根结点
T->data = e;//结点数据域置为e
T->left = CreatBiTree();//递归生成左子树
T->right = CreatBiTree();//递归生成右子树
}
return T;//返回结点指针
}
三、源代码
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <malloc.h>
typedef struct {
int data;//数据域
struct BiTNode* left, * right;//左子树右子树
}BiTNode, * BiTree;
BiTree CreatBiTree() {
BiTree T = NULL;//初始化为空树
int e;
scanf("%d", &e);//输入结点值
if (e != 0) {
T = (BiTree)malloc(sizeof(BiTNode));//生成根结点
T->data = e;//结点数据域置为e
T->left = CreatBiTree();//递归生成左子树
T->right = CreatBiTree();//递归生成右子树
}
return T;//返回结点指针
}
void PreOrderTraverse(BiTree T) {
if (T == NULL) return;
else {
printf("%d ", T->data);
PreOrderTraverse(T->left);
PreOrderTraverse(T->right);
}
}
int main() {
BiTree T = CreatBiTree();
printf("---------------\n");
PreOrderTraverse(T);
}