- 二叉树的基本运算
- 二叉树的定义
- 由str创建二叉链
- 求二叉树高度
- 求二叉树的结点个数
- 求二叉树的叶子结点个数
- 以括号表示法输出二叉树
- 以凹入表示法输出一棵二叉树
- main
二叉树的基本运算
二叉树的定义
#include <stdio.h>#include <malloc.h>#define MaxSize 100#define MaxWidth 40typedef char ElemType;typedef struct tnode{ ElemType data; struct tnode *lchild,*rchild;} BTNode;
由str创建二叉链
void CreateBTree(BTNode * &bt,char *str) /*由str创建二叉链bt*/{ BTNode *St[MaxSize],*p=NULL; int top=-1,k,j=0; char ch; bt=NULL; /*建立的二叉树初始时为空*/ ch=str[j]; while (ch!='\0') /*str未扫描完时循环*/ { switch(ch) { case '(':top++;St[top]=p;k=1; break; /*为左孩子结点*/ case ')':top--;break; case ',':k=2; break; /*为孩子结点右结点*/ default:p=(BTNode *)malloc(sizeof(BTNode)); p->data=ch;p->lchild=p->rchild=NULL; if (bt==NULL) /**p为二叉树的根结点*/ bt=p; else /*已建立二叉树根结点*/ { switch(k) { case 1:St[top]->lchild=p;break; case 2:St[top]->rchild=p;break; } } } j++; ch=str[j]; }}
求二叉树高度
int BTHeight(BTNode *bt) /*求二叉树高度*/{ int lchilddep,rchilddep; if (bt==NULL) return(0); /*空树的高度为0*/ else { lchilddep=BTHeight(bt->lchild); /*求左子树的高度为lchilddep*/ rchilddep=BTHeight(bt->rchild); /*求右子树的高度为rchilddep*/ return (lchilddep>rchilddep)? (lchilddep+1):(rchilddep+1); }}
求二叉树的结点个数
int NodeCount(BTNode *bt) /*求二叉树bt的结点个数*/{ int num1,num2; if (bt==NULL) /*空树结点个数为0*/ return 0; else { num1=NodeCount(bt->lchild); /*求出左子树的结点数*/ num2=NodeCount(bt->rchild); /*求出右子树的结点数*/ return (num1+num2+1); }}
求二叉树的叶子结点个数
int LeafCount(BTNode *bt) /*求二叉树bt的叶子结点个数*/{ int num1,num2; if (bt==NULL) /*空树叶子结点个数为0*/ return 0; else if (bt->lchild==NULL && bt->rchild==NULL) return 1; /*若为叶子结点返回1*/ else { num1=LeafCount(bt->lchild); /*求出左子树的叶子结点数*/ num2=LeafCount(bt->rchild); /*求出右子树的叶子结点数*/ return (num1+num2); }}
以括号表示法输出二叉树
void DispBTree(BTNode *bt) /*以括号表示法输出二叉树*/{ if (bt!=NULL) { printf("%c",bt->data); if (bt->lchild!=NULL || bt->rchild!=NULL) { printf("("); DispBTree(bt->lchild); /*递归处理左子树*/ if (bt->rchild!=NULL) printf(","); DispBTree(bt->rchild); /*递归处理右子树*/ printf(")"); } }}
以凹入表示法输出一棵二叉树
void DispBTree1(BTNode *bt) /*以凹入表示法输出一棵二叉树*/{ BTNode *St[MaxSize],*p; int Level[MaxSize][2],top=-1,n,i,width=4; char type; /*取值L表示为左结点,R表示为右结点,B表示为根结点*/ if (bt!=NULL) { top++; St[top]=bt; /*根结点入栈*/ Level[top][0]=width; Level[top][1]=2; /*2表示是根*/ while (top>-1) { p=St[top]; /*退栈并凹入显示该结点值*/ n=Level[top][0]; switch(Level[top][1]) { case 0:type='L';break; /*左结点之后输出(L)*/ case 1:type='R';break; /*右结点之后输出(R)*/ case 2:type='B';break; /*根结点之后前输出(B)*/ } for (i=1;i<=n;i++) /*其中n为显示场宽,字符以右对齐显示*/ printf(" "); printf("%c(%c)",p->data,type); for (i=n+1;i<=MaxWidth;i+=2) printf("━"); printf("\n"); top--; if (p->rchild!=NULL) { /*将右子树根结点入栈*/ top++; St[top]=p->rchild; Level[top][0]=n+width; /*场宽增width,即缩width格后再输出*/ Level[top][1]=1; /*1表示是右子树*/ } if (p->lchild!=NULL) { /*将左子树根结点入栈*/ top++; St[top]=p->lchild; Level[top][0]=n+width; /*显示场宽增width*/ Level[top][1]=0; /*0表示是左子树*/ } } }}
main
void main(){ BTNode *bt; CreateBTree(bt,"A(B(D,E(G,H)),C(,F(I)))"); /*构造图5.10(a)所示的二叉树*/ printf("二叉树bt:");DispBTree(bt);printf("\n"); printf("bt的高度:%d\n",BTHeight(bt)); printf("bt的结点数:%d\n",NodeCount(bt)); printf("bt的叶子结点数:%d\n",LeafCount(bt)); printf("bt凹入表示:\n");DispBTree1(bt);printf("\n");}