二叉树的链式存储
#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 char ElemType;
typedef int Status;
int i=1;
typedef char String[MAXSIZE];
String S;
typedef struct BTNode
{
ElemType data;
struct BTNode *leftChild,*rightChild;
}BTNode,*BTree;
Status initString(String S, char *ch){
if(strlen(ch)>=MAXSIZE){
return ERROR;
}
S[0] = strlen(ch);
int loc=0;
for(int i=1;i<=S[0];i++){
S[i] = *(ch+loc);
loc++;
}
printf("字符串初始化完成\n");
return OK;
}
Status printString(String S){
for(int i=0;i<=strlen(S);i++){
printf("%c ", S[i]);
}
printf("\n");
return OK;
}
Status initTree(BTree *T){
*T=NULL;
printf("初始化成功!\n");
return OK;
}
Status isEmpty(BTree T){
if(T==NULL){
return TRUE;
}else{
return FALSE;
}
}
void createBTree(BTree *T){
ElemType ch;
ch = S[i++];
if(ch=='#'){
*T=NULL;
}else{
*T=(BTree)malloc(sizeof(BTNode));
if(!*T){
printf("内存分配失败\n");
exit(OVERFLOW);
}else{
(*T)->data = ch;
createBTree(&(*T)->leftChild);
createBTree(&(*T)->rightChild);
}
}
}
Status destroyBTree(BTree *T){
if(*T){
if((*T)->leftChild){
destroyBTree(&(*T)->leftChild);
}
if((*T)->rightChild){
destroyBTree(&(*T)->rightChild);
}
free(*T);
*T=NULL;
}
return OK;
}
int getDepth(BTree *T){
int deep = 0;
if(*T!=NULL){
int leftdeep = getDepth(&(*T)->leftChild);
int rightdeep = getDepth(&(*T)->rightChild);
deep = leftdeep>=rightdeep?leftdeep+1:rightdeep+1;
}
return deep;
}
char getRoot(BTree T){
if(isEmpty(T)){
printf("根结点不存在,无法获取\n");
return ERROR;
}
return T->data;
}
char getValue(BTree T){
if(isEmpty(T)){
printf("当前结点不存在,无法获取\n");
return ERROR;
}
return T->data;
}
Status replaceValue(BTree *T, char *value){
(*T)->data = *value;
return OK;
}
void preOrederTraverse(BTree T){
if(T==NULL){
return;
}
printf("%c ", T->data);
preOrederTraverse(T->leftChild);
preOrederTraverse(T->rightChild);
}
void inOrderTraverse(BTree T){
if(T==NULL){
return;
}
inOrderTraverse(T->leftChild);
printf("%c ", T->data);
inOrderTraverse(T->rightChild);
}
void postOrderTraverse(BTree T){
if(T==NULL){
return;
}
postOrderTraverse(T->leftChild);
postOrderTraverse(T->rightChild);
printf("%c ", T->data);
}
int main()
{
BTree T;
initTree(&T);
initString(S, "EASO#N###H##EGO###G#O##");
printf("字符串初始为:\n");
printString(S);
printf("创建二叉树T\n");
createBTree(&T);
printf("完成创建二叉树T\n");
printf("二叉树的深度为:%d\n", getDepth(&T));
printf("前序遍历二叉树T:\n");
preOrederTraverse(T);
printf("\n中序遍历二叉树T:\n");
inOrderTraverse(T);
printf("\n后序遍历二叉树T:\n");
postOrderTraverse(T);
printf("\n此时的根结点为:%c\n", getRoot(T));
printf("将二叉树销毁后遍历可得:\n");
destroyBTree(&T);
preOrederTraverse(T);
printf("此时的根结点为:%c\n", getRoot(T));
return 0;
}