#include"stdio.h" #include"stdlib.h" #include"malloc.h" #include"conio.h" #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define OVERFLOW -2 #define TElemType char typedef struct BiTNode { TElemType data; struct BiTNode *LChild,*RChild; }BiTNode,*BiTree; int CreateBiTree(BiTree T) { // 算法6.4:按先序次序输入二叉树中结点的值(可为字符型或整型,在主程中定义), // 构造二叉链表表示的二叉树T。变量Nil表示空(子)树。有改动 TElemType ch; scanf("%c",&ch); if(ch=='#') // 空 T=NULL; else { T=(BiTree)malloc(sizeof(BiTNode)); // 生成根结点 if(!T) exit(OVERFLOW); T->data=ch; CreateBiTree(T->LChild); // 构造左子树 CreateBiTree(T->RChild); // 构造右子树 } return OK; } //先序遍历 void PreOrder(BiTree root) /*先序遍历二叉树, root为指向二叉树(或某一子树)根结点的指针*/ { if (root!=NULL) { printf("%c",root ->data);; //问根结点 PreOrder(root ->LChild); //先序遍历左子树 PreOrder(root ->RChild); //先序遍子树 } } void PostOrder(BiTree root) /* 后序遍历二叉树, root为指向二叉树(或某一子树)根结点的指针*/ { if(root!=NULL) { PostOrder(root ->LChild); /*后序遍历左子树*/ PostOrder(root ->RChild); /*后序遍历右子树* / Visit(root ->data); /*访问根结点*/ } } void InOrder(BiTree root) /*中序遍历二叉树, root为指向二叉树(或某一子树)根结点的指针*/ { if (root!=NULL) { InOrder(root->LChild); /*中序遍历左子树*/ printf("%c",root->data); /*访问根结点*/ InOrder(root->RChild); /*中序遍历右子树*/ } } int Leaf(BiTree root){ int LeafCount=0; if(root!=NULL) { Leaf(root->LChild); Leaf(root->RChild); if (root ->LChild==NULL && root ->RChild==NULL) LeafCount++; } return LeafCount; } int PostTreeDepth(BiTree bt){ /* 后序遍历求二叉树高度的递归算法 */ int hl, hr, max; if(bt!=NULL) { hl=PostTreeDepth(bt->LChild); /* 求左子树的深度 */ hr=PostTreeDepth(bt->RChild); /* 求右子树的深度 */ max=hl>hr?hl: hr; /* 得到左、 右子树深度较大者*/ return(max+1); /* 返回树的深度 */ } else return(0); /* 如果是空树, 则返回0 */ } void PrintTree(BiTree Bt,char nLayer) /* 按竖向树状打印的二叉树 */ { if(Bt==NULL) return; PrintTree(Bt->RChild, nLayer+1); for(int i=0; i<nLayer; i++) printf(" "); printf("%c\n", Bt->data); /*按逆中序输出结点,用层深决定结点的左右位置*/ PrintTree(Bt->LChild, nLayer+1); } int main(){ BiTree T; int nLayer=1,j; printf("按扩展先序遍历序列建立一又树,请输入序列:\n"); if(CreateBiTree(T))printf("创建二叉树失败\n"); else printf("创建三叉树成功\n"); printf("先序遍历输出序列为:"); PreOrder (T); getch(); printf("中序遍历输出序列为:"); InOrder(T); getch(); printf("后序遍历输出序列为:"); PostOrder(T); getch(); j=Leaf(T); printf("二叉树的叶子结点总数为:%d\n",j); printf("二叉树的高度为%d\n",PostTreeDepth(T)); printf("树桩输出二叉树:"); PrintTree(T,nLayer); return 0; }