树的链式存储结构
今天周末,无聊了,咱们观察下树怎么从枝杈长成参天大树吧!
首先,得把树杈栽入土中,我们先看一下土壤吧!
#include "stdio.h" #include "stdlib.h" #include "string" #include "math.h" #include "io.h" #include "time.h" #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define MAXSIZE 100 typedef int Status; typedef char TElemType; TElemType Ni1 = ' ';
土壤咱们选择完了,于是咱们就幻想树长大了,有各种各样的树叶,那一片一片的树叶脉络,真棒!
int index = 1; typedef char String[24]; String str; Status StrAssign(String T, char* chars) { int i; if (strlen(chars) > MAXSIZE) return ERROR; else { T[0] = strlen(chars); for (i = 1; i <=T[0]; i++) T[i] = *(chars + i - 1); return OK; } }
还有那各种各样的树杈,也很不错!
typedef struct BiTNode { TElemType data; struct BiTNode *lchild, *rchild; }BiTNode,*BiTree;
但,咱们现在没有树杈,手里空空
Status InitBiTree(BiTree *T) { *T=NULL; return OK; }
于是,咱们去买赶紧栽种吧!终于种完了,于是每天给他浇水,期待着它慢慢的长大,终于他长大了,长了各种各样的树枝
void CreateBiTree(BiTree *T) { TElemType ch; /* scanf("%c",&ch); */ ch=str[index++]; if(ch=='#') *T=NULL; else { *T=(BiTree)malloc(sizeof(BiTNode)); if(!*T) exit(OVERFLOW); (*T)->data=ch; /* 生成根结点 */ CreateBiTree(&(*T)->lchild); /* 构造左子树 */ CreateBiTree(&(*T)->rchild); /* 构造右子树 */ } }
树长大了,但是它结了几层的树杈啊,咱们还是数一数吧!
int BiTreeDepth(BiTree T) { int i, j; if (!T) return 0; if (T->lchild) i = BiTreeDepth(T->lchild); else i = 0; if (T->rchild) j = BiTreeDepth(T->rchild); else j = 0; return 1 + i > j ? i : j; }
树长得太大了,树根都冒出花盆外了,明显可以看到树根了
TElemType Root(BiTree T) { if (T) return T->data; else return Ni1; }
我的天,这片树叶真好看啊,不信你看一看
TElemType Value(BiTree p) { return p->data; }
妹妹,你往树叶上瞎涂什么啊!你看看被你涂成什么样子了?
void Assign(BiTree p, TElemType value) { p->data = value; }
妹妹突然被我这么一吼,吓坏了,于是就哭了,哎,早知这样,我就不吼了,还得哄!
“妹妹啊!别哭哈!咱们一起数叶子吧,咱们先从上往下面数吧”(前序)
void PreOrderTraverse(BiTree T) { if (T==NULL) return; printf("%c", T->data); PreOrderTraverse(T->lchild); PreOrderTraverse(T->rchild); }
“咱们从上往下数完,咱们就从左往右数吧!”(中序)
void InOrderTraverse(BiTree T) { if (T == NULL) return; InOrderTraverse(T->lchild); printf("%c", T->data); InOrderTraverse(T->rchild); }
“这回,咱们从下往上数吧”(后序)
void PostOrderTraverse(BiTree T) { if (T == NULL) return; PostOrderTraverse(T->lchild); PostOrderTraverse(T->rchild); printf("%c", T->data); }
随着一天一天过去,到了秋天,树叶黄了,于是变成了落叶
void DestroyBiTree(BiTree *T) { if (*T) { if ((*T)->lchild) DestroyBiTree(&(*T)->lchild); if ((*T)->rchild) DestroyBiTree(&(*T)->rchild); free(*T); *T = NULL; } } #define ClearBiTree DestroyBiTree
树的成长我已经拍下来了,你们可以自己看一下吧!
int main() { int i; BiTree T; TElemType e1; InitBiTree(&T); StrAssign(str, "ABDH#K###E##CFI###G#J##"); CreateBiTree(&T); printf("构造空二叉树后,树空否?%d(1:是 0:否) 树的深度=%d\n", BiTreeEmpty(T), BiTreeDepth(T)); e1 = Root(T); printf("二叉树的根为: %c\n", e1); printf("\n前序遍历二叉树:"); PreOrderTraverse(T); printf("\n中序遍历二叉树:"); InOrderTraverse(T); printf("\n后序遍历二叉树:"); PostOrderTraverse(T); ClearBiTree(&T); printf("\n清除二叉树后,树空否?%d(1:是 0:否) 树的深度=%d\n", BiTreeEmpty(T), BiTreeDepth(T)); i = Root(T); if (!i) printf("树空,无根\n"); getchar(); return 0; }