今天周末,无聊了,咱们观察下树怎么从枝杈长成参天大树吧!
首先,得把树杈栽入土中,我们先看一下土壤吧!
#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 100typedef 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;}