typedef struct node { ElemType data; struct node* lchild; struct node* rchild; }BTNode;
创建
void CreateBTree(BTNode*& b, char* str) { BTNode* st[MAXSIZE], * p = NULL; b = NULL; int top = -1; int j = 0, i = 0; char ch = str[j]; while (ch != '\0') { switch (ch) { case'(': top++; st[top] = p; i = 1; break; case')': top--; break; case',': i = 2; break; default: p = (BTNode*)malloc(sizeof(BTNode)); p->data = ch; p->lchild = p->rchild = NULL; if (b == NULL) b = p; else { switch (i) { case 1: st[top]->lchild = p; break; case 2: st[top]->rchild = p; break; } } } j++; ch = str[j]; } }
销毁
void DestroyBTree(BTNode*& b) { if (b != NULL) { DestroyBTree(b->rchild); DestroyBTree(b->rchild); free(b); } }
查找结点
BTNode* FindNode(BTNode* b, ElemType x) { if (b == NULL) return NULL; else if (b->data == x) return b; else { if (FindNode(b->lchild, x) != NULL) return FindNode(b->lchild, x); else return FindNode(b->rchild, x); } }
求树高
int BTHeight(BTNode* b) { int lchild, rchild; if (b == NULL) return 0; else { lchild = BTHeight(b->lchild); rchild = BTHeight(b->rchild); return lchild > rchild ? (lchild + 1) : (rchild + 1); } }
输出
void DispBTree(BTNode* b) { if (b != NULL) { printf("%c", b->data); if (b->lchild != NULL || b->rchild != NULL) { printf("("); DispBTree(b->lchild); if (b->rchild != NULL) printf(","); DispBTree(b->rchild); printf(")"); } } }
前序遍历
void PreOrder(BTNode* b) { if (b != NULL) { printf("%c", b->data); PreOrder(b->lchild); PreOrder(b->rchild); } }
中序遍历
void InOrder(BTNode* b) { if (b != NULL) { InOrder(b->lchild); printf("%c", b->data); InOrder(b->rchild); } }
后序遍历
void PostOrder(BTNode* b) { if (b != NULL) { PostOrder(b->lchild); PostOrder(b->rchild); printf("%c", b->data); } }
求结点数
int Nodes(BTNode* b) { if (b == NULL) return 0; else return(Nodes(b->lchild) + Nodes(b->rchild) + 1); }
输出所有叶子结点
void DispLeaf(BTNode* b) { if (b != NULL) { if (b->lchild == NULL && b->rchild == NULL) printf("%c", b->data); DispLeaf(b->lchild); DispLeaf(b->rchild); } }