二叉树链式存储结构
用链表来表示一棵二叉树,即用链来指示元素的逻辑关系。通常的方法是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址。其结点结构为:
其中,data域存放某结点的数据信息;lchild与rchild分别存放指向左孩子和右孩子的指针,当左孩子或右孩子不存在时,相应指针域值为空(用符号∧或NULL表示)。利用这样的结点结构表示的二叉树的链式存储结构被称为二叉链表。
二叉树的创建
#include<stdio.h>
#include<malloc.h>
#define maxsize 100
typedef char elempyte;
typedef struct node{
elempyte data;
struct node *lchild,*rchild;
}BT;
//创建二叉树
BT *createBTree(){
BT *bt;
char ch;
ch = getchar();//输入字符
getchar();//接收回车符
if(ch=='#'){
bt = NULL;
} else{
bt = (BT *)malloc(sizeof(BT));
bt->data = ch;
printf("\n\t\t请输入%c节点的左子树:",bt->data);
bt->lchild=createBTree();
printf("\n\t\t请输入%c节点的右子树:",bt->data);
bt->rchild=createBTree();
}
return bt;
}
void printTree(BT *bt){
if(bt!=NULL){
printf("%c",bt->data);//输出根节点
if(bt->lchild!=NULL||bt->rchild!=NULL){
printf("(");
printTree(bt->lchild);//递归输出左子树
if(bt->rchild!=NULL){
printf(",");
}
printTree(bt->rchild);//递归输出右子树
printf(")");
}
}
}
先序遍历
void preOrder(BT *bt){
if(bt!=NULL){
printf("%4c",bt->data);
preOrder(bt->lchild);//递归遍历左子树
preOrder(bt->rchild);//递归遍历右子树
}
}
中序遍历
void midOrder(BT *bt){
if(bt!=NULL){
midOrder(bt->lchild);
printf("%4c",bt->data);
midOrder(bt->rchild);
}
}
后续遍历
void postOrder(BT *bt){
if(bt!=NULL){
postOrder(bt->lchild);
postOrder(bt->rchild);
printf("%4c",bt->data);
}
}
测试文件
#include"tree.c"
int main(){
printf("\n\t\t请输入根节点:");
BT *tree = createBTree();
printf("\n输入的二叉树为:") ;
printTree(tree);
printf("\n先序遍历:");
preOrder(tree);
printf("\n中序遍历:");
midOrder(tree);
printf("\n后序遍历:");
postOrder(tree);
}